ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

/* $Id: AliTRDtrackingSector.cxx 23810 2008-02-08 09:00:27Z hristov $ */

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Tracking data container for one sector                                   //
//                                                                           //
//  Authors:                                                                 //
//    Alex Bercuci <A.Bercuci@gsi.de>                                        //
//    Markus Fasel <M.Fasel@gsi.de>                                          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "AliTRDReconstructor.h"
#include "AliTRDtrackingSector.h"
#include "AliTRDtrackingChamber.h"


ClassImp(AliTRDtrackingSector)

//_____________________________________________________________________________
AliTRDtrackingSector::AliTRDtrackingSector()
  :fSector(-1)
  ,fN(0)
  ,fGeom(NULL)
{
  // Default constructor
  
  memset(fChamber, 0, AliTRDgeometry::kNdets*sizeof(AliTRDtrackingChamber*));
  memset(fStack,   0, AliTRDgeometry::kNlayer*sizeof(AliTRDtrackingChamber*));
  memset(fIndex, -1, AliTRDgeometry::kNdets*sizeof(Char_t));
  memset(fX0, 0, AliTRDgeometry::kNlayer*sizeof(Float_t));
}

//_____________________________________________________________________________
AliTRDtrackingSector::AliTRDtrackingSector(AliTRDgeometry *geo, Int_t gs)
  :fSector(gs)
  ,fN(0)
  ,fGeom(geo)
{
  //
  // AliTRDtrackingSector Constructor
  //

  memset(fChamber, 0, AliTRDgeometry::kNdets*sizeof(AliTRDtrackingChamber*));
  memset(fStack,   0, AliTRDgeometry::kNlayer*sizeof(AliTRDtrackingChamber*));
  memset(fIndex, -1, AliTRDgeometry::kNdets*sizeof(Char_t));
  memset(fX0, 0, AliTRDgeometry::kNlayer*sizeof(Float_t));
}

    
//_____________________________________________________________________________
void AliTRDtrackingSector::Init(const AliTRDReconstructor *rec)
{		
// 	Steer building of tracking chambers and build tracking sector.
// 	Propagate radial position information (calibration/alignment aware) from chambers to sector level
//
  
  AliTRDchamberTimeBin *tb = NULL;
  AliTRDtrackingChamber **tc = &fChamber[0];
  for(Int_t ic = 0; (ic<AliTRDgeometry::kNdets) && (*tc); ic++, tc++){
    for(Int_t itb=0; itb<AliTRDseedV1::kNtb; itb++){
      if(!(tb = (*tc)->GetTB(itb))) continue;
      tb->SetReconstructor(rec);
    }
    (*tc)->Build(fGeom, rec->IsHLT());
  }
    
  Int_t nl;
  for(int il=0; il<AliTRDgeometry::kNlayer; il++){
    fX0[il] = 0.; nl = 0;
    for(int is=0; is<AliTRDgeometry::kNstack; is++){
      Int_t idx = is*AliTRDgeometry::kNlayer + il;
      if(fIndex[idx]<0) continue;
      fX0[il] += GetChamber(fIndex[idx])->GetX(); 
      nl++; 
    }
    if(!nl){
      //printf("Could not estimate radial position  of plane %d in sector %d.\n", ip, fSector);
      continue;
    }
    fX0[il] /= Float_t(nl);
  }
}



//_____________________________________________________________________________
void AliTRDtrackingSector::Clear(const Option_t *opt)
{
// Reset counters and steer chamber clear

  AliTRDtrackingChamber **tc = &fChamber[0];
  for(Int_t ich=0; ich<fN; ich++, tc++){ 
    (*tc)->Clear(opt);
    delete (*tc); (*tc) = NULL;   // I would avoid
  }	
  memset(fIndex, -1, AliTRDgeometry::kNdets*sizeof(Char_t));
  fN = 0;
}

//_____________________________________________________________________________
AliTRDtrackingChamber* AliTRDtrackingSector::GetChamber(Int_t stack, Int_t layer, Bool_t build)
{
// Return chamber at position (stack, plane) in current 
// sector or build a new one if it is not already created
  
  Int_t ch = stack*AliTRDgeometry::kNlayer + layer;
  if(fIndex[ch] >= 0) return fChamber[Int_t(fIndex[ch])];
  else if(!build) return NULL;
  
  // CHAMBER HAS TO BE BUILD
  Int_t rch = ch;do rch--; while(rch>=0 && fIndex[rch]<0);
  fIndex[ch] = rch >=0 ? fIndex[rch]+1 : 0; 
  fN++;
  
  memmove(&fChamber[Int_t(fIndex[ch])+1], &fChamber[Int_t(fIndex[ch])], (AliTRDgeometry::kNdets-fIndex[ch]-1)*sizeof(void*));
  for(Int_t ic = ch+1; ic<AliTRDgeometry::kNdets; ic++) fIndex[ic] += fIndex[ic] >= 0 ? 1 : 0;
  
  AliTRDtrackingChamber *chmb = fChamber[Int_t(fIndex[ch])] = new AliTRDtrackingChamber();
  chmb->SetDetector(AliTRDgeometry::GetDetector(layer, stack, fSector));
  return chmb;
}

//_____________________________________________________________________________
AliTRDtrackingChamber** AliTRDtrackingSector::GetStack(Int_t stack)
{
// Return chamber at position (stack, plane) in current 
// sector or build a new one if it is not already created
  
  if(stack<0 || stack>=AliTRDgeometry::kNstack) return NULL;
  
  Int_t ich, n = 0;
  for(int il=0; il<AliTRDgeometry::kNlayer; il++){
    ich = stack*AliTRDgeometry::kNlayer + il;
    if(fIndex[ich] < 0) fStack[il] = NULL; 
    else{
      fStack[il] = fChamber[Int_t(fIndex[ich])];
      n++;
    }
  }
  
  return n ? &fStack[0] : NULL;
}

//_____________________________________________________________________________
void AliTRDtrackingSector::Print(Option_t *opt) const
{
// Dump info about this tracking sector and the tracking chamber within
// 

  printf("\n\tSector[%2d]\n", fSector);
  for(int il=0; il<AliTRDgeometry::kNlayer; il++){
    for(int is =0; is<AliTRDgeometry::kNstack; is++){
      Int_t ch = is*AliTRDgeometry::kNlayer + il;
      if(opt) fChamber[Int_t(fIndex[ch])]->Print(opt);
      else printf("%2d[%2d] ", fIndex[ch], fIndex[ch]>=0 ? fChamber[Int_t(fIndex[ch])]->GetNClusters() : 0);
    }
    if(!opt) printf("\n");
  }

}
 AliTRDtrackingSector.cxx:1
 AliTRDtrackingSector.cxx:2
 AliTRDtrackingSector.cxx:3
 AliTRDtrackingSector.cxx:4
 AliTRDtrackingSector.cxx:5
 AliTRDtrackingSector.cxx:6
 AliTRDtrackingSector.cxx:7
 AliTRDtrackingSector.cxx:8
 AliTRDtrackingSector.cxx:9
 AliTRDtrackingSector.cxx:10
 AliTRDtrackingSector.cxx:11
 AliTRDtrackingSector.cxx:12
 AliTRDtrackingSector.cxx:13
 AliTRDtrackingSector.cxx:14
 AliTRDtrackingSector.cxx:15
 AliTRDtrackingSector.cxx:16
 AliTRDtrackingSector.cxx:17
 AliTRDtrackingSector.cxx:18
 AliTRDtrackingSector.cxx:19
 AliTRDtrackingSector.cxx:20
 AliTRDtrackingSector.cxx:21
 AliTRDtrackingSector.cxx:22
 AliTRDtrackingSector.cxx:23
 AliTRDtrackingSector.cxx:24
 AliTRDtrackingSector.cxx:25
 AliTRDtrackingSector.cxx:26
 AliTRDtrackingSector.cxx:27
 AliTRDtrackingSector.cxx:28
 AliTRDtrackingSector.cxx:29
 AliTRDtrackingSector.cxx:30
 AliTRDtrackingSector.cxx:31
 AliTRDtrackingSector.cxx:32
 AliTRDtrackingSector.cxx:33
 AliTRDtrackingSector.cxx:34
 AliTRDtrackingSector.cxx:35
 AliTRDtrackingSector.cxx:36
 AliTRDtrackingSector.cxx:37
 AliTRDtrackingSector.cxx:38
 AliTRDtrackingSector.cxx:39
 AliTRDtrackingSector.cxx:40
 AliTRDtrackingSector.cxx:41
 AliTRDtrackingSector.cxx:42
 AliTRDtrackingSector.cxx:43
 AliTRDtrackingSector.cxx:44
 AliTRDtrackingSector.cxx:45
 AliTRDtrackingSector.cxx:46
 AliTRDtrackingSector.cxx:47
 AliTRDtrackingSector.cxx:48
 AliTRDtrackingSector.cxx:49
 AliTRDtrackingSector.cxx:50
 AliTRDtrackingSector.cxx:51
 AliTRDtrackingSector.cxx:52
 AliTRDtrackingSector.cxx:53
 AliTRDtrackingSector.cxx:54
 AliTRDtrackingSector.cxx:55
 AliTRDtrackingSector.cxx:56
 AliTRDtrackingSector.cxx:57
 AliTRDtrackingSector.cxx:58
 AliTRDtrackingSector.cxx:59
 AliTRDtrackingSector.cxx:60
 AliTRDtrackingSector.cxx:61
 AliTRDtrackingSector.cxx:62
 AliTRDtrackingSector.cxx:63
 AliTRDtrackingSector.cxx:64
 AliTRDtrackingSector.cxx:65
 AliTRDtrackingSector.cxx:66
 AliTRDtrackingSector.cxx:67
 AliTRDtrackingSector.cxx:68
 AliTRDtrackingSector.cxx:69
 AliTRDtrackingSector.cxx:70
 AliTRDtrackingSector.cxx:71
 AliTRDtrackingSector.cxx:72
 AliTRDtrackingSector.cxx:73
 AliTRDtrackingSector.cxx:74
 AliTRDtrackingSector.cxx:75
 AliTRDtrackingSector.cxx:76
 AliTRDtrackingSector.cxx:77
 AliTRDtrackingSector.cxx:78
 AliTRDtrackingSector.cxx:79
 AliTRDtrackingSector.cxx:80
 AliTRDtrackingSector.cxx:81
 AliTRDtrackingSector.cxx:82
 AliTRDtrackingSector.cxx:83
 AliTRDtrackingSector.cxx:84
 AliTRDtrackingSector.cxx:85
 AliTRDtrackingSector.cxx:86
 AliTRDtrackingSector.cxx:87
 AliTRDtrackingSector.cxx:88
 AliTRDtrackingSector.cxx:89
 AliTRDtrackingSector.cxx:90
 AliTRDtrackingSector.cxx:91
 AliTRDtrackingSector.cxx:92
 AliTRDtrackingSector.cxx:93
 AliTRDtrackingSector.cxx:94
 AliTRDtrackingSector.cxx:95
 AliTRDtrackingSector.cxx:96
 AliTRDtrackingSector.cxx:97
 AliTRDtrackingSector.cxx:98
 AliTRDtrackingSector.cxx:99
 AliTRDtrackingSector.cxx:100
 AliTRDtrackingSector.cxx:101
 AliTRDtrackingSector.cxx:102
 AliTRDtrackingSector.cxx:103
 AliTRDtrackingSector.cxx:104
 AliTRDtrackingSector.cxx:105
 AliTRDtrackingSector.cxx:106
 AliTRDtrackingSector.cxx:107
 AliTRDtrackingSector.cxx:108
 AliTRDtrackingSector.cxx:109
 AliTRDtrackingSector.cxx:110
 AliTRDtrackingSector.cxx:111
 AliTRDtrackingSector.cxx:112
 AliTRDtrackingSector.cxx:113
 AliTRDtrackingSector.cxx:114
 AliTRDtrackingSector.cxx:115
 AliTRDtrackingSector.cxx:116
 AliTRDtrackingSector.cxx:117
 AliTRDtrackingSector.cxx:118
 AliTRDtrackingSector.cxx:119
 AliTRDtrackingSector.cxx:120
 AliTRDtrackingSector.cxx:121
 AliTRDtrackingSector.cxx:122
 AliTRDtrackingSector.cxx:123
 AliTRDtrackingSector.cxx:124
 AliTRDtrackingSector.cxx:125
 AliTRDtrackingSector.cxx:126
 AliTRDtrackingSector.cxx:127
 AliTRDtrackingSector.cxx:128
 AliTRDtrackingSector.cxx:129
 AliTRDtrackingSector.cxx:130
 AliTRDtrackingSector.cxx:131
 AliTRDtrackingSector.cxx:132
 AliTRDtrackingSector.cxx:133
 AliTRDtrackingSector.cxx:134
 AliTRDtrackingSector.cxx:135
 AliTRDtrackingSector.cxx:136
 AliTRDtrackingSector.cxx:137
 AliTRDtrackingSector.cxx:138
 AliTRDtrackingSector.cxx:139
 AliTRDtrackingSector.cxx:140
 AliTRDtrackingSector.cxx:141
 AliTRDtrackingSector.cxx:142
 AliTRDtrackingSector.cxx:143
 AliTRDtrackingSector.cxx:144
 AliTRDtrackingSector.cxx:145
 AliTRDtrackingSector.cxx:146
 AliTRDtrackingSector.cxx:147
 AliTRDtrackingSector.cxx:148
 AliTRDtrackingSector.cxx:149
 AliTRDtrackingSector.cxx:150
 AliTRDtrackingSector.cxx:151
 AliTRDtrackingSector.cxx:152
 AliTRDtrackingSector.cxx:153
 AliTRDtrackingSector.cxx:154
 AliTRDtrackingSector.cxx:155
 AliTRDtrackingSector.cxx:156
 AliTRDtrackingSector.cxx:157
 AliTRDtrackingSector.cxx:158
 AliTRDtrackingSector.cxx:159
 AliTRDtrackingSector.cxx:160
 AliTRDtrackingSector.cxx:161
 AliTRDtrackingSector.cxx:162
 AliTRDtrackingSector.cxx:163
 AliTRDtrackingSector.cxx:164
 AliTRDtrackingSector.cxx:165
 AliTRDtrackingSector.cxx:166
 AliTRDtrackingSector.cxx:167
 AliTRDtrackingSector.cxx:168
 AliTRDtrackingSector.cxx:169
 AliTRDtrackingSector.cxx:170
 AliTRDtrackingSector.cxx:171
 AliTRDtrackingSector.cxx:172
 AliTRDtrackingSector.cxx:173
 AliTRDtrackingSector.cxx:174
 AliTRDtrackingSector.cxx:175
 AliTRDtrackingSector.cxx:176