ROOT logo
#include <TClonesArray.h>
#include "AliITSURecoLayer.h"
#include "AliITSsegmentation.h"
#include "AliITSUAux.h"
#include "AliITSUClusterPix.h"
#include "AliITSUGeomTGeo.h"
#include "AliLog.h"

using namespace AliITSUAux;
using namespace TMath;

ClassImp(AliITSURecoLayer)


//______________________________________________________
AliITSURecoLayer::AliITSURecoLayer(const char* name)
 :fActiveID(-1)
  ,fNSensors(0)
  ,fNSensorRows(0)
  ,fNSensorsPerRow(0)
  ,fSensVIDtoMatrixID(0)
  ,fR(0)
  ,fRMax(0)
  ,fRMin(0)
  ,fZMax(0)
  ,fZMin(0)
  ,fPhiOffs(0)
  ,fSensDZInv(0)
  ,fSensDPhiInv(0)
  ,fMaxStep(0.5)
  ,fSensors(0)
  ,fITSGeom(0)
  ,fClusters(0)
{
  // def. c-tor
  SetNameTitle(name,name);
}

//______________________________________________________
AliITSURecoLayer::AliITSURecoLayer(const char* name, Int_t activeID, AliITSUGeomTGeo* gm)
  :fActiveID(activeID)
  ,fNSensors(0)
  ,fNSensorRows(0)
  ,fNSensorsPerRow(0)
  ,fSensVIDtoMatrixID(0)
  ,fR(0)
  ,fRMax(0)
  ,fRMin(0)
  ,fZMax(0)
  ,fZMin(0)
  ,fPhiOffs(0)
  ,fSensDZInv(0)
  ,fSensDPhiInv(0)
  ,fMaxStep(0.5)
  ,fSensors(0)
  ,fITSGeom(gm)
  ,fClusters(0)
{
  // def. c-tor
  SetNameTitle(name,name);
  Build();
}

//______________________________________________________
AliITSURecoLayer::~AliITSURecoLayer()
{
  // def. d-tor
  delete fSensors;
  delete[] fSensVIDtoMatrixID;
  if (GetOwnsClusterArray()) delete fClusters;
}

//______________________________________________________
void AliITSURecoLayer::Print(Option_t* opt) const			      
{
  //print 
  printf("Lr %-15s %d (act:%+d), NSens: %4d in %3d rows| MaxStep:%.2f ",
	 GetName(),GetID(),GetActiveID(),GetNSensors(),GetNSensorRows(),fMaxStep);
  printf("%6.3f<R<%6.3f | %+8.3f<Z<%+8.3f dZ:%6.3f dPhi:%6.3f\n",fRMin,fRMax,fZMin,fZMax,
	 fSensDZInv>0 ? 1/fSensDZInv : 0, fSensDPhiInv>0 ? 1/fSensDPhiInv : 0);
  TString opts = opt; opts.ToLower();
  if (opts.Contains("sn")) for (int i=0;i<GetNSensors();i++) GetSensor(i)->Print(opt);
}

//______________________________________________________
void AliITSURecoLayer::Build()
{
  // build internal structures
  const double kSafeR = 0.05; // safety margin for Rmin,Rmax of the layer
  if (fActiveID<0) return;
  //
  int nStaves=fITSGeom->GetNStaves(fActiveID);
  // determine number of sensor rows (sensors aligned at same phi and spanning the Z range of the layer)
  fNSensorRows = nStaves;
  //
  // if the stave has susbtaves, each substave can have multiple rows of sensors (but just 1 row of modules)
  if (fITSGeom->GetNHalfStaves(fActiveID)>0) fNSensorRows *= fITSGeom->GetNHalfStaves(fActiveID);
  //
  // if there are modules defined, the module may have multiple rows of sensors (though not spanning full Z)
  if (fITSGeom->GetNModules(fActiveID)>0) fNSensorRows *= fITSGeom->GetNChipRowsPerModule(fActiveID);
  //
  fNSensors = fITSGeom->GetNChipsPerLayer(fActiveID);
  fNSensorsPerRow = fNSensors/fNSensorRows;
  //
  fSensors = new TObjArray(fNSensors);
  fSensVIDtoMatrixID = new Int_t[fNSensors];
  const AliITSsegmentation* kSegm = fITSGeom->GetSegmentation(fActiveID);
  //
  TGeoHMatrix mmod;
  const TGeoHMatrix* mt2l;
  double phiTF,rTF, loc[3]={0,0,0},glo[3];
  //
  int nSensPerStave = fITSGeom->GetNChipsPerStave(fActiveID);
  for (int staveI=0;staveI<nStaves;staveI++) {
    for (int sensI=0;sensI<nSensPerStave;sensI++) {
      int sID = fITSGeom->GetChipIndex(fActiveID,staveI,sensI);
      AliITSURecoSens* sens = new AliITSURecoSens( sID );
      fSensors->AddLast(sens);
      double phiMin=1e9,phiMax=-1e9,zMin=1e9,zMax=-1e9;
      // this is NOT the sensor matrix, just the ideal chip matrix to get neighbors correct
      fITSGeom->GetOrigMatrix(sID,mmod); 
      //
      for (int ix=0;ix<2;ix++) {       // determine sensor boundaries (ideal)
	loc[0] = (ix-0.5)*kSegm->Dx(); // +-DX/2
	for (int iy=0;iy<2;iy++) {
	  loc[1] = (iy-0.5)*kSegm->Dy(); // +-DY/2
	  for (int iz=0;iz<2;iz++) {
	    loc[2] = (iz-0.5)*kSegm->Dz(); // +-DZ/2
	    mmod.LocalToMaster(loc,glo);
	    double phi = ATan2(glo[1],glo[0]);
	    BringTo02Pi(phi);
	    if      (phiMin>1e8)  phiMin=phi;
	    else if (!OKforPhiMin(phiMin,phi)) phiMin=phi;
	    if      (phiMax<-1e8) phiMax=phi; 
	    else if (!OKforPhiMax(phiMax,phi)) phiMax=phi;	      
	    if (glo[2]>zMax) zMax=glo[2];
	    if (glo[2]<zMin) zMin=glo[2];
	  }
	}
      }
      sens->SetBoundaries(phiMin,phiMax,zMin,zMax);
    }
  }
  fSensors->Sort(); // sort sensors to get the neighborhood correct
  //
  // now fill real sensor angles, Z's, accounting for misalignment
  fRMin=fZMin=1e9;
  fRMax=fZMax=-1e9;
  //
  fPhiOffs = 0;
  int firstSensID = fITSGeom->GetFirstChipIndex(fActiveID);
  for (int sensI=0;sensI<fNSensors;sensI++) {
    AliITSURecoSens* sens = GetSensor(sensI);
    mmod = *fITSGeom->GetMatrixSens(sens->GetID());
    fSensVIDtoMatrixID[sens->GetID() - firstSensID] = sensI;
    double phiMin=1e9,phiMax=-1e9,zMin=1e9,zMax=-1e9;
    for (int ix=0;ix<2;ix++) {
      loc[0] = (ix-0.5)*kSegm->Dx(); // +-DX/2
      for (int iy=0;iy<2;iy++) {
	loc[1] = (iy-0.5)*kSegm->Dy(); // +-DY/2
	for (int iz=0;iz<2;iz++) {
	  loc[2] = (iz-0.5)*kSegm->Dz(); // +-DZ/2
	  //
	  mmod.LocalToMaster(loc,glo);
	  double phi = ATan2(glo[1],glo[0]);
	  double r   = glo[0]*glo[0] + glo[1]*glo[1];
	  if (fRMin>r) fRMin = r;
	  if (fRMax<r) fRMax = r;
	  BringTo02Pi(phi);
	  if      (phiMin>1e8) phiMin=phi; 
	  else if (!OKforPhiMin(phiMin,phi)) phiMin=phi;
	  if      (phiMax<-1e8) phiMax=phi;
	  else if (!OKforPhiMax(phiMax,phi)) phiMax=phi;	      
	  if (glo[2]>zMax) zMax=glo[2];
	  if (glo[2]<zMin) zMin=glo[2];
	}
      }
    }
    mt2l = fITSGeom->GetMatrixT2L( sens->GetID() );
    mmod.Multiply(mt2l);	
    loc[0]=loc[1]=loc[2]=0;
    mmod.LocalToMaster(loc,glo);
    rTF   = Sqrt(glo[0]*glo[0] + glo[1]*glo[1]);  //  tracking params (misaligned)
    phiTF = ATan2(glo[1],glo[0]);
    BringTo02Pi(phiTF);
    //
    sens->SetXTF(rTF);
    sens->SetPhiTF(phiTF);
    sens->SetBoundaries(phiMin,phiMax,zMin,zMax);
    if (fZMin>zMin) fZMin = zMin;
    if (fZMax<zMax) fZMax = zMax;
    //
    if (sensI<fNSensorsPerRow) fPhiOffs += MeanPhiSmall(phiMax,phiMin);
  }
  //
  fPhiOffs /= fNSensorsPerRow; // average phi of the 1st row
  fSensDZInv = fNSensorsPerRow/(fZMax-fZMin);
  fSensDPhiInv = fNSensorRows/(2*Pi());
  //
  fRMin = Sqrt(fRMin);
  fRMax = Sqrt(fRMax);
  fR = 0.5*(fRMin+fRMax);
  fRMin -= kSafeR;
  fRMax += kSafeR;
  //
}

//______________________________________________________
Int_t AliITSURecoLayer::FindSensors(const double* impPar, AliITSURecoSens *sensors[kMaxSensMatching])
{
  // find sensors having intersection with track
  // impPar contains: lab phi of track, dphi, labZ, dz
  //
  double zMn=impPar[2]-impPar[3], zMx=impPar[2]+impPar[3]; 
  if (zMn>fZMax) return 0;
  if (zMx<fZMin) return 0;
  //
  int zCenID = int((impPar[2]-fZMin)*fSensDZInv);
  if      (zCenID<0) zCenID = 0;
  else if (zCenID>=fNSensorsPerRow) zCenID = fNSensorsPerRow-1;
  double phiCn = impPar[0] - fPhiOffs;
  //  BringTo02Pi(phiCn); 
  int rowCenID = int(phiCn*fSensDPhiInv);
  //
  // due to the misalignments the actual sensorID's might be shifted
  int res = 0;
  AliITSURecoSens* sensPrev=0, *sens = GetSensor(rowCenID,zCenID);
  //
  //  printf("Guess: Primary Sensor: phiID: %d zID: %d ->",rowCenID,zCenID); sens->Print();
  //
  while ( (res=sens->CheckCoverage(impPar[0], impPar[2])) ) {
    if      (res&AliITSURecoSens::kRight) {if (++rowCenID==fNSensorRows) rowCenID=0;} // neighbor on the right (larger phi)
    else if (res&AliITSURecoSens::kLeft)  {if (--rowCenID<0) rowCenID = fNSensorRows-1;}      // neighbor on the left (smaller phi)
    if      (res&AliITSURecoSens::kUp)    {if (++zCenID==fNSensorsPerRow) zCenID = fNSensorsPerRow-1;}    // neighbor at larger Z (if any)
    else if (res&AliITSURecoSens::kDown)  {if (--zCenID<0) zCenID = 0;}               // neighbor at smaller Z (if any)
    //
    AliITSURecoSens* sensAlt = GetSensor(rowCenID,zCenID);
    if (sensAlt==sens || sensAlt==sensPrev) break;  // there is no better neighbor (z edge) or the point falls in dead area
    //
    sensPrev = sens;
    sens = sensAlt;
  }
  //  printf("Found: Primary Sensor: phiID: %d zID: %d ->",rowCenID,zCenID); sens->Print();
  //
  int nFnd = 0;
  sensors[nFnd++] = sens;
  //
  double phiMn = impPar[0]-impPar[1], phiMx = impPar[0]+impPar[1];
  BringTo02Pi(phiMn);
  BringTo02Pi(phiMx);
  //
  const int kNNeighb = 8;
  const int kCheckNeighb[2][kNNeighb] = { // phi and Z neighbours to check
    { 1, 1, 0,-1,-1,-1, 0, 1},
    { 0, 1, 1, 1, 0,-1,-1,-1}
  };
  //  
  //  printf("Search: %+.4f %+.4f | %+.4f %+.4f\n",phiMn,phiMx, zMn,zMx);
  for (int inb=kNNeighb;inb--;) {
    int idz = kCheckNeighb[1][inb];
    int iz   = zCenID   + idz;
    //    printf("#%d  dp:%+d dz:%+d IZ: %d\n",inb, kCheckNeighb[0][inb], kCheckNeighb[1][inb], iz);
    //
    if (iz<0 || iz>=fNSensorsPerRow) continue;
    int idphi = kCheckNeighb[0][inb];
    int iphi = rowCenID + idphi;
    if      (iphi<0) iphi += fNSensorRows;
    else if (iphi>=fNSensorRows) iphi -= fNSensorRows;
    sens = GetSensor(iphi,iz);
    //
    if      (idz>0) {if (zMx<sens->GetZMin()) continue;}
    else if (idz<0) {if (zMn>sens->GetZMax()) continue;}
    //
    // Z range matches
    if      (idphi>0) {if (!OKforPhiMin(sens->GetPhiMin(),phiMx)) continue;}
    else if (idphi<0) {if (!OKforPhiMax(sens->GetPhiMax(),phiMn)) continue;}
    //
    //    printf("Add %d\n",nFnd);
    sensors[nFnd++] = sens;
    if (nFnd==kMaxSensMatching) break;
  }
  return nFnd;
}

//*/
/*
Int_t AliITSURecoLayer::FindSensors(const double* impPar, AliITSURecoSens *sensors[AliITSURecoSens::kNNeighbors],int mcLab)
{
  // find sensors having intersection with track
  // impPar contains: lab phi of track, dphi, labZ, dz

  //tmp>>>
  int nFnd = 0;
  int fndSens[50];
  if (mcLab>=0) { // find correct sensors from MC info
    int ncl = GetNClusters();
    for (int icl=ncl;icl--;) {
      AliCluster* cl = GetCluster(icl);
      for (int ilb=0;ilb<3;ilb++) {
	if (cl->GetLabel(ilb)<0) break;
	if (cl->GetLabel(ilb)==mcLab) {fndSens[nFnd++] = cl->GetVolumeId(); break;}
      }
    }
    if (nFnd>0) {
      Int_t layS,staS,sensS;
      for (int is=0;is<nFnd;is++) {
	fITSGeom->GetChipId(fndSens[is],layS,staS,sensS);
	printf("SNMC#%d(%d): %d %d %d | ",is,mcLab,layS,staS,sensS); GetSensorFromID(fndSens[is])->Print();
      }
    }
  }

  //tmp<<<

  double z = impPar[2];
  if (z>fZMax+impPar[3]) {
    if (nFnd>0) printf("MissedSens!!!\n");
    return 0; // outside of Z coverage
  }
  z -= fZMin;
  if (z<-impPar[3]) {
    if (nFnd>0) printf("MissedSens!!!\n");
    return 0; // outside of Z coverage
  }
  int sensInSta = int(z*fSensDZInv);
  if      (sensInSta<0) sensInSta = 0;
  else if (sensInSta>=fNSensInStave) sensInSta = fNSensInStave-1;
  //
  double phi = impPar[0] - fPhiOffs;
  BringTo02Pi(phi);
  int staID = int(phi*fSensDPhiInv);  // stave id
  int nsens = 0;
  //
  AliITSURecoSens* sensN,*sens = GetSensor(staID*fNSensInStave+sensInSta);
  sensors[nsens++] = sens;
  //
  // check neighbours
  double zMn=impPar[2]-impPar[3], zMx=impPar[2]+impPar[3], phiMn=impPar[0]-impPar[1], phiMx=impPar[0]+impPar[1];
  BringTo02Pi(phiMn);
  BringTo02Pi(phiMx);
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbR)); // neighbor on the right (smaller phi)
  if (sensN && OKforPhiMin(phiMn,sensN->GetPhiMax())) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbTR)); // neighbor on the top right (smaller phi, larger Z)
  if (sensN && OKforPhiMin(phiMn,sensN->GetPhiMax()) && sensN->GetZMin()<zMx) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbT)); // neighbor on the top (larger Z)
  if (sensN && sensN->GetZMin()<zMx) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbTL)); // neighbor on the top left (larger Z, larger phi)
  if (sensN && OKforPhiMax(phiMx,sensN->GetPhiMin()) && sensN->GetZMin()<zMx) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbL)); // neighbor on the left (larger phi)
  if (sensN && OKforPhiMax(phiMx,sensN->GetPhiMin())) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbBL)); // neighbor on the bottom left (smaller Z, larger phi)
  if (sensN && OKforPhiMax(phiMx,sensN->GetPhiMin()) && sensN->GetZMax()>zMn) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbB));  // neighbor on the bottom (smaller Z)
  if (sensN && sensN->GetZMax()>zMn) sensors[nsens++] = sensN;
  //
  sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbBR)); // neighbor on the bottom right (smaller Z, smaller phi)
  if (sensN && OKforPhiMin(phiMn,sensN->GetPhiMax()) && sensN->GetZMax()>zMn) sensors[nsens++] = sensN;
  //
  if (mcLab>=0) {
    Int_t layS,staS,sensS;
    printf("Found %d sensors for phi %.3f : %.3f | Z %.4f %.4f\n", nsens,phiMn,phiMx,zMn,zMx); 
    for (int is=0;is<nsens;is++) {
      fITSGeom->GetChipId(sensors[is]->GetID()+fITSGeom->GetFirstModIndex(fActiveID),layS,staS,sensS);
      printf("*SNF#%d: %d %d %d | ",is,layS,staS,sensS); sensors[is]->Print();
    }
    for (int ism=0;ism<nFnd;ism++) {
      AliITSURecoSens* snMC = GetSensorFromID(fndSens[ism]);
      Bool_t ok=kFALSE;
      for (int isf=0;isf<nsens;isf++) {
	if (snMC==sensors[isf]) {ok=kTRUE;break;}
      }
      if (!ok) printf("MissedSens %d!!!\n",ism);
    }
  }
  return nsens;
}
*/
//______________________________________________________
void AliITSURecoLayer::ProcessClusters(Int_t mode)
{
  // register in each sensor of the layer its cluster.
  // the clusters of the layer must be sorted per sensor
  int ncl = fClusters->GetEntriesFast();
  int curSensID = -1;
  for (int i=fNSensors;i--;) GetSensor(i)->SetNClusters(0);
  AliITSURecoSens* curSens = 0;
  for (int icl=0;icl<ncl;icl++) {
    AliITSUClusterPix* cl = (AliITSUClusterPix*) fClusters->UncheckedAt(icl);
    cl->SetRecoInfo(0);
    cl->GoToFrameTrk();
    int vID = cl->GetVolumeId();
    if (vID<curSensID) {AliFatal("Clusters are not sorted in increasing sensorID");}
    if (vID>curSensID) {
      if (curSens) curSens->ProcessClusters(mode);    // prepare clusters for reconstruction
      curSens   = GetSensorFromID(vID); //GetSensor(vID - fITSGeom->GetFirstChipIndex(fActiveID));
      curSensID = vID;
      curSens->SetFirstClusterId(icl);
    }
    curSens->IncNClusters();
  }
  if (curSens) curSens->ProcessClusters(mode); // last sensor was not processed yet
  //
}

//______________________________________________________
Bool_t AliITSURecoLayer::IsEqual(const TObject* obj) const
{
  // check if layers are equal in R
  const AliITSURecoLayer* lr = (const AliITSURecoLayer*)obj;
  return Abs(lr->GetR()-GetR())<1e-6 ? kTRUE : kFALSE;
}

//______________________________________________________
Int_t  AliITSURecoLayer::Compare(const TObject* obj) const
{
  // compare two layers
  const AliITSURecoLayer* lr = (const AliITSURecoLayer*)obj;
  double dr = GetR() - lr->GetR();
  if (Abs(dr)<1e-6) return 0;
  return dr>0 ? 1:-1;
  //      
}

//_________________________________________________________________
AliITSURecoSens* AliITSURecoLayer::GetSensorFromID(Int_t i) const 
{
  // get sensor from its global id
  i -= fITSGeom->GetFirstChipIndex(fActiveID);
  if (i<0||i>=fNSensors) AliFatal(Form("Sensor with id=%d is not in layer %d",i+fITSGeom->GetFirstChipIndex(fActiveID),fActiveID));
  return GetSensor(SensVIDtoMatrixID(i));
}
 AliITSURecoLayer.cxx:1
 AliITSURecoLayer.cxx:2
 AliITSURecoLayer.cxx:3
 AliITSURecoLayer.cxx:4
 AliITSURecoLayer.cxx:5
 AliITSURecoLayer.cxx:6
 AliITSURecoLayer.cxx:7
 AliITSURecoLayer.cxx:8
 AliITSURecoLayer.cxx:9
 AliITSURecoLayer.cxx:10
 AliITSURecoLayer.cxx:11
 AliITSURecoLayer.cxx:12
 AliITSURecoLayer.cxx:13
 AliITSURecoLayer.cxx:14
 AliITSURecoLayer.cxx:15
 AliITSURecoLayer.cxx:16
 AliITSURecoLayer.cxx:17
 AliITSURecoLayer.cxx:18
 AliITSURecoLayer.cxx:19
 AliITSURecoLayer.cxx:20
 AliITSURecoLayer.cxx:21
 AliITSURecoLayer.cxx:22
 AliITSURecoLayer.cxx:23
 AliITSURecoLayer.cxx:24
 AliITSURecoLayer.cxx:25
 AliITSURecoLayer.cxx:26
 AliITSURecoLayer.cxx:27
 AliITSURecoLayer.cxx:28
 AliITSURecoLayer.cxx:29
 AliITSURecoLayer.cxx:30
 AliITSURecoLayer.cxx:31
 AliITSURecoLayer.cxx:32
 AliITSURecoLayer.cxx:33
 AliITSURecoLayer.cxx:34
 AliITSURecoLayer.cxx:35
 AliITSURecoLayer.cxx:36
 AliITSURecoLayer.cxx:37
 AliITSURecoLayer.cxx:38
 AliITSURecoLayer.cxx:39
 AliITSURecoLayer.cxx:40
 AliITSURecoLayer.cxx:41
 AliITSURecoLayer.cxx:42
 AliITSURecoLayer.cxx:43
 AliITSURecoLayer.cxx:44
 AliITSURecoLayer.cxx:45
 AliITSURecoLayer.cxx:46
 AliITSURecoLayer.cxx:47
 AliITSURecoLayer.cxx:48
 AliITSURecoLayer.cxx:49
 AliITSURecoLayer.cxx:50
 AliITSURecoLayer.cxx:51
 AliITSURecoLayer.cxx:52
 AliITSURecoLayer.cxx:53
 AliITSURecoLayer.cxx:54
 AliITSURecoLayer.cxx:55
 AliITSURecoLayer.cxx:56
 AliITSURecoLayer.cxx:57
 AliITSURecoLayer.cxx:58
 AliITSURecoLayer.cxx:59
 AliITSURecoLayer.cxx:60
 AliITSURecoLayer.cxx:61
 AliITSURecoLayer.cxx:62
 AliITSURecoLayer.cxx:63
 AliITSURecoLayer.cxx:64
 AliITSURecoLayer.cxx:65
 AliITSURecoLayer.cxx:66
 AliITSURecoLayer.cxx:67
 AliITSURecoLayer.cxx:68
 AliITSURecoLayer.cxx:69
 AliITSURecoLayer.cxx:70
 AliITSURecoLayer.cxx:71
 AliITSURecoLayer.cxx:72
 AliITSURecoLayer.cxx:73
 AliITSURecoLayer.cxx:74
 AliITSURecoLayer.cxx:75
 AliITSURecoLayer.cxx:76
 AliITSURecoLayer.cxx:77
 AliITSURecoLayer.cxx:78
 AliITSURecoLayer.cxx:79
 AliITSURecoLayer.cxx:80
 AliITSURecoLayer.cxx:81
 AliITSURecoLayer.cxx:82
 AliITSURecoLayer.cxx:83
 AliITSURecoLayer.cxx:84
 AliITSURecoLayer.cxx:85
 AliITSURecoLayer.cxx:86
 AliITSURecoLayer.cxx:87
 AliITSURecoLayer.cxx:88
 AliITSURecoLayer.cxx:89
 AliITSURecoLayer.cxx:90
 AliITSURecoLayer.cxx:91
 AliITSURecoLayer.cxx:92
 AliITSURecoLayer.cxx:93
 AliITSURecoLayer.cxx:94
 AliITSURecoLayer.cxx:95
 AliITSURecoLayer.cxx:96
 AliITSURecoLayer.cxx:97
 AliITSURecoLayer.cxx:98
 AliITSURecoLayer.cxx:99
 AliITSURecoLayer.cxx:100
 AliITSURecoLayer.cxx:101
 AliITSURecoLayer.cxx:102
 AliITSURecoLayer.cxx:103
 AliITSURecoLayer.cxx:104
 AliITSURecoLayer.cxx:105
 AliITSURecoLayer.cxx:106
 AliITSURecoLayer.cxx:107
 AliITSURecoLayer.cxx:108
 AliITSURecoLayer.cxx:109
 AliITSURecoLayer.cxx:110
 AliITSURecoLayer.cxx:111
 AliITSURecoLayer.cxx:112
 AliITSURecoLayer.cxx:113
 AliITSURecoLayer.cxx:114
 AliITSURecoLayer.cxx:115
 AliITSURecoLayer.cxx:116
 AliITSURecoLayer.cxx:117
 AliITSURecoLayer.cxx:118
 AliITSURecoLayer.cxx:119
 AliITSURecoLayer.cxx:120
 AliITSURecoLayer.cxx:121
 AliITSURecoLayer.cxx:122
 AliITSURecoLayer.cxx:123
 AliITSURecoLayer.cxx:124
 AliITSURecoLayer.cxx:125
 AliITSURecoLayer.cxx:126
 AliITSURecoLayer.cxx:127
 AliITSURecoLayer.cxx:128
 AliITSURecoLayer.cxx:129
 AliITSURecoLayer.cxx:130
 AliITSURecoLayer.cxx:131
 AliITSURecoLayer.cxx:132
 AliITSURecoLayer.cxx:133
 AliITSURecoLayer.cxx:134
 AliITSURecoLayer.cxx:135
 AliITSURecoLayer.cxx:136
 AliITSURecoLayer.cxx:137
 AliITSURecoLayer.cxx:138
 AliITSURecoLayer.cxx:139
 AliITSURecoLayer.cxx:140
 AliITSURecoLayer.cxx:141
 AliITSURecoLayer.cxx:142
 AliITSURecoLayer.cxx:143
 AliITSURecoLayer.cxx:144
 AliITSURecoLayer.cxx:145
 AliITSURecoLayer.cxx:146
 AliITSURecoLayer.cxx:147
 AliITSURecoLayer.cxx:148
 AliITSURecoLayer.cxx:149
 AliITSURecoLayer.cxx:150
 AliITSURecoLayer.cxx:151
 AliITSURecoLayer.cxx:152
 AliITSURecoLayer.cxx:153
 AliITSURecoLayer.cxx:154
 AliITSURecoLayer.cxx:155
 AliITSURecoLayer.cxx:156
 AliITSURecoLayer.cxx:157
 AliITSURecoLayer.cxx:158
 AliITSURecoLayer.cxx:159
 AliITSURecoLayer.cxx:160
 AliITSURecoLayer.cxx:161
 AliITSURecoLayer.cxx:162
 AliITSURecoLayer.cxx:163
 AliITSURecoLayer.cxx:164
 AliITSURecoLayer.cxx:165
 AliITSURecoLayer.cxx:166
 AliITSURecoLayer.cxx:167
 AliITSURecoLayer.cxx:168
 AliITSURecoLayer.cxx:169
 AliITSURecoLayer.cxx:170
 AliITSURecoLayer.cxx:171
 AliITSURecoLayer.cxx:172
 AliITSURecoLayer.cxx:173
 AliITSURecoLayer.cxx:174
 AliITSURecoLayer.cxx:175
 AliITSURecoLayer.cxx:176
 AliITSURecoLayer.cxx:177
 AliITSURecoLayer.cxx:178
 AliITSURecoLayer.cxx:179
 AliITSURecoLayer.cxx:180
 AliITSURecoLayer.cxx:181
 AliITSURecoLayer.cxx:182
 AliITSURecoLayer.cxx:183
 AliITSURecoLayer.cxx:184
 AliITSURecoLayer.cxx:185
 AliITSURecoLayer.cxx:186
 AliITSURecoLayer.cxx:187
 AliITSURecoLayer.cxx:188
 AliITSURecoLayer.cxx:189
 AliITSURecoLayer.cxx:190
 AliITSURecoLayer.cxx:191
 AliITSURecoLayer.cxx:192
 AliITSURecoLayer.cxx:193
 AliITSURecoLayer.cxx:194
 AliITSURecoLayer.cxx:195
 AliITSURecoLayer.cxx:196
 AliITSURecoLayer.cxx:197
 AliITSURecoLayer.cxx:198
 AliITSURecoLayer.cxx:199
 AliITSURecoLayer.cxx:200
 AliITSURecoLayer.cxx:201
 AliITSURecoLayer.cxx:202
 AliITSURecoLayer.cxx:203
 AliITSURecoLayer.cxx:204
 AliITSURecoLayer.cxx:205
 AliITSURecoLayer.cxx:206
 AliITSURecoLayer.cxx:207
 AliITSURecoLayer.cxx:208
 AliITSURecoLayer.cxx:209
 AliITSURecoLayer.cxx:210
 AliITSURecoLayer.cxx:211
 AliITSURecoLayer.cxx:212
 AliITSURecoLayer.cxx:213
 AliITSURecoLayer.cxx:214
 AliITSURecoLayer.cxx:215
 AliITSURecoLayer.cxx:216
 AliITSURecoLayer.cxx:217
 AliITSURecoLayer.cxx:218
 AliITSURecoLayer.cxx:219
 AliITSURecoLayer.cxx:220
 AliITSURecoLayer.cxx:221
 AliITSURecoLayer.cxx:222
 AliITSURecoLayer.cxx:223
 AliITSURecoLayer.cxx:224
 AliITSURecoLayer.cxx:225
 AliITSURecoLayer.cxx:226
 AliITSURecoLayer.cxx:227
 AliITSURecoLayer.cxx:228
 AliITSURecoLayer.cxx:229
 AliITSURecoLayer.cxx:230
 AliITSURecoLayer.cxx:231
 AliITSURecoLayer.cxx:232
 AliITSURecoLayer.cxx:233
 AliITSURecoLayer.cxx:234
 AliITSURecoLayer.cxx:235
 AliITSURecoLayer.cxx:236
 AliITSURecoLayer.cxx:237
 AliITSURecoLayer.cxx:238
 AliITSURecoLayer.cxx:239
 AliITSURecoLayer.cxx:240
 AliITSURecoLayer.cxx:241
 AliITSURecoLayer.cxx:242
 AliITSURecoLayer.cxx:243
 AliITSURecoLayer.cxx:244
 AliITSURecoLayer.cxx:245
 AliITSURecoLayer.cxx:246
 AliITSURecoLayer.cxx:247
 AliITSURecoLayer.cxx:248
 AliITSURecoLayer.cxx:249
 AliITSURecoLayer.cxx:250
 AliITSURecoLayer.cxx:251
 AliITSURecoLayer.cxx:252
 AliITSURecoLayer.cxx:253
 AliITSURecoLayer.cxx:254
 AliITSURecoLayer.cxx:255
 AliITSURecoLayer.cxx:256
 AliITSURecoLayer.cxx:257
 AliITSURecoLayer.cxx:258
 AliITSURecoLayer.cxx:259
 AliITSURecoLayer.cxx:260
 AliITSURecoLayer.cxx:261
 AliITSURecoLayer.cxx:262
 AliITSURecoLayer.cxx:263
 AliITSURecoLayer.cxx:264
 AliITSURecoLayer.cxx:265
 AliITSURecoLayer.cxx:266
 AliITSURecoLayer.cxx:267
 AliITSURecoLayer.cxx:268
 AliITSURecoLayer.cxx:269
 AliITSURecoLayer.cxx:270
 AliITSURecoLayer.cxx:271
 AliITSURecoLayer.cxx:272
 AliITSURecoLayer.cxx:273
 AliITSURecoLayer.cxx:274
 AliITSURecoLayer.cxx:275
 AliITSURecoLayer.cxx:276
 AliITSURecoLayer.cxx:277
 AliITSURecoLayer.cxx:278
 AliITSURecoLayer.cxx:279
 AliITSURecoLayer.cxx:280
 AliITSURecoLayer.cxx:281
 AliITSURecoLayer.cxx:282
 AliITSURecoLayer.cxx:283
 AliITSURecoLayer.cxx:284
 AliITSURecoLayer.cxx:285
 AliITSURecoLayer.cxx:286
 AliITSURecoLayer.cxx:287
 AliITSURecoLayer.cxx:288
 AliITSURecoLayer.cxx:289
 AliITSURecoLayer.cxx:290
 AliITSURecoLayer.cxx:291
 AliITSURecoLayer.cxx:292
 AliITSURecoLayer.cxx:293
 AliITSURecoLayer.cxx:294
 AliITSURecoLayer.cxx:295
 AliITSURecoLayer.cxx:296
 AliITSURecoLayer.cxx:297
 AliITSURecoLayer.cxx:298
 AliITSURecoLayer.cxx:299
 AliITSURecoLayer.cxx:300
 AliITSURecoLayer.cxx:301
 AliITSURecoLayer.cxx:302
 AliITSURecoLayer.cxx:303
 AliITSURecoLayer.cxx:304
 AliITSURecoLayer.cxx:305
 AliITSURecoLayer.cxx:306
 AliITSURecoLayer.cxx:307
 AliITSURecoLayer.cxx:308
 AliITSURecoLayer.cxx:309
 AliITSURecoLayer.cxx:310
 AliITSURecoLayer.cxx:311
 AliITSURecoLayer.cxx:312
 AliITSURecoLayer.cxx:313
 AliITSURecoLayer.cxx:314
 AliITSURecoLayer.cxx:315
 AliITSURecoLayer.cxx:316
 AliITSURecoLayer.cxx:317
 AliITSURecoLayer.cxx:318
 AliITSURecoLayer.cxx:319
 AliITSURecoLayer.cxx:320
 AliITSURecoLayer.cxx:321
 AliITSURecoLayer.cxx:322
 AliITSURecoLayer.cxx:323
 AliITSURecoLayer.cxx:324
 AliITSURecoLayer.cxx:325
 AliITSURecoLayer.cxx:326
 AliITSURecoLayer.cxx:327
 AliITSURecoLayer.cxx:328
 AliITSURecoLayer.cxx:329
 AliITSURecoLayer.cxx:330
 AliITSURecoLayer.cxx:331
 AliITSURecoLayer.cxx:332
 AliITSURecoLayer.cxx:333
 AliITSURecoLayer.cxx:334
 AliITSURecoLayer.cxx:335
 AliITSURecoLayer.cxx:336
 AliITSURecoLayer.cxx:337
 AliITSURecoLayer.cxx:338
 AliITSURecoLayer.cxx:339
 AliITSURecoLayer.cxx:340
 AliITSURecoLayer.cxx:341
 AliITSURecoLayer.cxx:342
 AliITSURecoLayer.cxx:343
 AliITSURecoLayer.cxx:344
 AliITSURecoLayer.cxx:345
 AliITSURecoLayer.cxx:346
 AliITSURecoLayer.cxx:347
 AliITSURecoLayer.cxx:348
 AliITSURecoLayer.cxx:349
 AliITSURecoLayer.cxx:350
 AliITSURecoLayer.cxx:351
 AliITSURecoLayer.cxx:352
 AliITSURecoLayer.cxx:353
 AliITSURecoLayer.cxx:354
 AliITSURecoLayer.cxx:355
 AliITSURecoLayer.cxx:356
 AliITSURecoLayer.cxx:357
 AliITSURecoLayer.cxx:358
 AliITSURecoLayer.cxx:359
 AliITSURecoLayer.cxx:360
 AliITSURecoLayer.cxx:361
 AliITSURecoLayer.cxx:362
 AliITSURecoLayer.cxx:363
 AliITSURecoLayer.cxx:364
 AliITSURecoLayer.cxx:365
 AliITSURecoLayer.cxx:366
 AliITSURecoLayer.cxx:367
 AliITSURecoLayer.cxx:368
 AliITSURecoLayer.cxx:369
 AliITSURecoLayer.cxx:370
 AliITSURecoLayer.cxx:371
 AliITSURecoLayer.cxx:372
 AliITSURecoLayer.cxx:373
 AliITSURecoLayer.cxx:374
 AliITSURecoLayer.cxx:375
 AliITSURecoLayer.cxx:376
 AliITSURecoLayer.cxx:377
 AliITSURecoLayer.cxx:378
 AliITSURecoLayer.cxx:379
 AliITSURecoLayer.cxx:380
 AliITSURecoLayer.cxx:381
 AliITSURecoLayer.cxx:382
 AliITSURecoLayer.cxx:383
 AliITSURecoLayer.cxx:384
 AliITSURecoLayer.cxx:385
 AliITSURecoLayer.cxx:386
 AliITSURecoLayer.cxx:387
 AliITSURecoLayer.cxx:388
 AliITSURecoLayer.cxx:389
 AliITSURecoLayer.cxx:390
 AliITSURecoLayer.cxx:391
 AliITSURecoLayer.cxx:392
 AliITSURecoLayer.cxx:393
 AliITSURecoLayer.cxx:394
 AliITSURecoLayer.cxx:395
 AliITSURecoLayer.cxx:396
 AliITSURecoLayer.cxx:397
 AliITSURecoLayer.cxx:398
 AliITSURecoLayer.cxx:399
 AliITSURecoLayer.cxx:400
 AliITSURecoLayer.cxx:401
 AliITSURecoLayer.cxx:402
 AliITSURecoLayer.cxx:403
 AliITSURecoLayer.cxx:404
 AliITSURecoLayer.cxx:405
 AliITSURecoLayer.cxx:406
 AliITSURecoLayer.cxx:407
 AliITSURecoLayer.cxx:408
 AliITSURecoLayer.cxx:409
 AliITSURecoLayer.cxx:410
 AliITSURecoLayer.cxx:411
 AliITSURecoLayer.cxx:412
 AliITSURecoLayer.cxx:413
 AliITSURecoLayer.cxx:414
 AliITSURecoLayer.cxx:415
 AliITSURecoLayer.cxx:416
 AliITSURecoLayer.cxx:417
 AliITSURecoLayer.cxx:418
 AliITSURecoLayer.cxx:419
 AliITSURecoLayer.cxx:420
 AliITSURecoLayer.cxx:421
 AliITSURecoLayer.cxx:422
 AliITSURecoLayer.cxx:423
 AliITSURecoLayer.cxx:424
 AliITSURecoLayer.cxx:425
 AliITSURecoLayer.cxx:426
 AliITSURecoLayer.cxx:427
 AliITSURecoLayer.cxx:428
 AliITSURecoLayer.cxx:429
 AliITSURecoLayer.cxx:430
 AliITSURecoLayer.cxx:431
 AliITSURecoLayer.cxx:432
 AliITSURecoLayer.cxx:433
 AliITSURecoLayer.cxx:434
 AliITSURecoLayer.cxx:435
 AliITSURecoLayer.cxx:436
 AliITSURecoLayer.cxx:437
 AliITSURecoLayer.cxx:438