ROOT logo
#include <TGeoVolume.h>
#include <TGeoTube.h>
#include <TGeoManager.h>
#include <TTree.h>
#include "AliITSURecoDet.h"
#include "AliITSUGeomTGeo.h"
#include "AliITSsegmentation.h"
#include "AliITSUClusterPix.h"
#include "AliITSUReconstructor.h"



ClassImp(AliITSURecoDet)


const Char_t* AliITSURecoDet::fgkBeamPipeVolName = "IP_PIPE";

//______________________________________________________
AliITSURecoDet::AliITSURecoDet()
:  fNLayers(0)
  ,fNLayersActive(0)
  ,fRMax(-1)
  ,fRMin(-1)
  ,fRITSTPCRef(-1)
  ,fLayers(0)
  ,fLayersActive(0)
  ,fGeom(0)
{
  // def. c-tor
}

//______________________________________________________
AliITSURecoDet::AliITSURecoDet(AliITSUGeomTGeo* geom, const char* name)
:  fNLayers(0)
  ,fNLayersActive(0)
  ,fRMax(-1)
  ,fRMin(-1)
  ,fRITSTPCRef(-1)
  ,fLayers(0)
  ,fLayersActive(0)
  ,fGeom(geom)
{
  // def. c-tor
  SetNameTitle(name,name);
  fLayers.SetOwner(kTRUE);        // layers belong to this array
  fLayersActive.SetOwner(kFALSE); // this one just points on active layers in fLayers
  Build();
}

//______________________________________________________
AliITSURecoDet::~AliITSURecoDet()
{
  // def. d-tor
  fLayersActive.Clear(); 
  fLayers.Clear();         // owned!
}

//______________________________________________________
void AliITSURecoDet::Print(Option_t* opt) const			      
{
  //print 
  printf("Detector %s, %d layers, %d active layers\n",GetName(),GetNLayers(),GetNLayersActive());
  TString opts = opt; opts.ToLower();
  if (opts.Contains("lr")) {
    for (int i=0;i<GetNLayers();i++) GetLayer(i)->Print(opt);
    printf("ITS-TPC matching reference R: %.3f\n",fRITSTPCRef);
  }
}

//______________________________________________________
void AliITSURecoDet::AddLayer(const AliITSURecoLayer* lr)
{
  //add new layer
  fLayers.AddLast((TObject*)lr);
  fNLayers++;
  if (lr->IsActive()) {
    fLayersActive.AddLast((TObject*)lr);
    fNLayersActive++;
  }
}

//______________________________________________________
Bool_t AliITSURecoDet::Build()
{
  // build detector from TGeo
  //
  if (!fGeom) AliFatal("Geometry interface is not set");
  int nlr = fGeom->GetNLayers();
  if (!nlr) AliFatal("No geometry loaded");
  //
  // build active ITS layers
  for (int ilr=0;ilr<nlr;ilr++) {
    int lrTyp = fGeom->GetLayerChipTypeID(ilr);
    // name layer according its active id, detector type and segmentation tyoe
    AliITSURecoLayer* lra = new AliITSURecoLayer(Form("Lr%d%s%d",ilr,fGeom->GetChipTypeName(lrTyp),
						      lrTyp%AliITSUGeomTGeo::kMaxSegmPerChipType),
						 ilr,fGeom);
    lra->SetPassive(kFALSE);
    AddLayer(lra);
  }
  //
  // build passive ITS layers
  //
  double rMin,rMax,zMin,zMax;
  // beam pipe
  TGeoVolume *v = gGeoManager->GetVolume(fgkBeamPipeVolName);
  AliITSURecoLayer* lrp = 0;
  if (!v) AliWarning("No beam pipe found in geometry");
  else {
    TGeoTube *t=(TGeoTube*)v->GetShape();
    rMin = t->GetRmin();
    rMax = t->GetRmax();
    zMin =-t->GetDz();
    zMax = t->GetDz();
    lrp = new AliITSURecoLayer("BeamPipe");
    lrp->SetRMin(rMin);
    lrp->SetRMax(rMax);
    lrp->SetR(0.5*(rMin+rMax));
    lrp->SetZMin(zMin);
    lrp->SetZMax(zMax);
    lrp->SetPassive(kTRUE);
    AddLayer(lrp);
    //
  }
  //
  // TPC-ITS wall
  const AliITSURecoParam* recopar = AliITSUReconstructor::GetRecoParam();
  if (recopar) {
    lrp = new AliITSURecoLayer("TPC-ITSwall");
    lrp->SetRMin(AliITSUReconstructor::GetRecoParam()->GetTPCITSWallRMin());
    lrp->SetRMax(AliITSUReconstructor::GetRecoParam()->GetTPCITSWallRMax());
    lrp->SetR(0.5*(lrp->GetRMin()+lrp->GetRMax()));
    lrp->SetZMin(-AliITSUReconstructor::GetRecoParam()->GetTPCITSWallZSpanH());
    lrp->SetZMax( AliITSUReconstructor::GetRecoParam()->GetTPCITSWallZSpanH());
    lrp->SetMaxStep( AliITSUReconstructor::GetRecoParam()->GetTPCITSWallMaxStep());
    lrp->SetPassive(kTRUE);
    AddLayer(lrp);
  }
  else {
    AliWarning("RecoParam is not available, TPC-ITS wall is not set");
  }
  //
  IndexLayers();
  Print("lr");
  return kTRUE;
}

//______________________________________________________
void AliITSURecoDet::IndexLayers()
{
  // sort and index layers
  const Double_t kRMargin = 1e-2; // 100 micron margin
  fLayersActive.Sort();
  for (int i=0;i<fNLayersActive;i++) GetLayerActive(i)->SetActiveID(i);
  fLayers.Sort();
  for (int i=0;i<fNLayers;i++) GetLayer(i)->SetID(i);
  if (fNLayers>0) {
    SetRMin(GetLayer(0)->GetRMin()-kRMargin);
    SetRMax(GetLayer(fNLayers-1)->GetRMax()+kRMargin);
  }
  //
  // define the reference R for ITS/TPC matching: outside of last layer but before TPC materials
  const double kOffsLastActR = 5.; // offset of reference layer wrt last active R
  int lastActive = GetLrIDActive(fNLayersActive-1);
  AliITSURecoLayer* lrA = GetLayer(lastActive); // last active
  double rref = lrA->GetRMax() + kOffsLastActR;
  //
  if (lastActive <  fNLayers-1) { // there are material layers outside ...
    AliITSURecoLayer* lrL = GetLayer(lastActive+1);
    if (lrL->GetRMin()<=rref) rref = lrL->GetRMin();
    if (rref - lrA->GetRMax()<kOffsLastActR) {
      AliError(Form("The ITS-TPC matching reference R=%.2f is too close to last active R=%.3f",rref,lrA->GetRMax()));
    }
  }
  SetRITSTPCRef(rref);
  //
}

//______________________________________________________
Int_t AliITSURecoDet::FindLastLayerID(Double_t r, int dir) const
{
  // find the last layer which the particle moving in direction dir (1:outward,-1:inward) 
  // will traverse on its way to radius r 
  int ilr;
  //
  if (dir>0) {
    for (ilr=0;ilr<fNLayers;ilr++) {
      AliITSURecoLayer* lr = GetLayer(ilr);
      if ( r<lr->GetR(-dir) ) break;  // this layer at least entered
    }
    return --ilr;  // -1 will correspond to point below the smalles layer
  }
  else {
    for (ilr=fNLayers;ilr--;) {
      AliITSURecoLayer* lr = GetLayer(ilr);
      if ( r>lr->GetR(-dir) ) break; // this layer at least entered
    }
    ilr++;
    return ilr<fNLayers ? ilr:-1; // -1 will correspond to point above outer layer
  }
  //
}

//______________________________________________________
Int_t AliITSURecoDet::FindFirstLayerID(Double_t r, int dir) const
{
  // find the first layer which the particle moving in direction dir (1:outward,-1:inward) 
  // will traverse starting from radius r 
  int ilr;
  //
  if (dir>0) {
    for (ilr=0;ilr<fNLayers;ilr++) {
      AliITSURecoLayer* lr = GetLayer(ilr);
      if ( r<lr->GetR(dir) ) break;  // this layer at least entered
    }
    return ilr<fNLayers ? ilr:-1;  // -1 will correspond to point above outer leayer
  }
  else {
    for (ilr=fNLayers;ilr--;) {
      AliITSURecoLayer* lr = GetLayer(ilr);
      if ( r>lr->GetR(dir) ) break; // this layer at least entered
    }
    return ilr; // -1 will correspond to point below inner layer
  }
  //
}

//______________________________________________________
void AliITSURecoDet::CreateClusterArrays()
{
  // create cluster arrays for active layers
  for (int ilr=0;ilr<fNLayersActive;ilr++) {
    AliITSURecoLayer*  lr = GetLayerActive(ilr);
    lr->SetOwnsClusterArray(kTRUE);
    int tpDet = fGeom->GetLayerChipTypeID(ilr)/AliITSUGeomTGeo::kMaxSegmPerChipType;
    //
    if (tpDet == AliITSUGeomTGeo::kChipTypePix) {
      lr->SetClusters(new TClonesArray(AliITSUClusterPix::Class()));
    }
    else {
      AliFatal(Form("Unknown detector type %d",tpDet));
    }
    //
  }
  //
}

//_____________________________________________________________________________
Int_t AliITSURecoDet::LoadClusters(TTree* treeRP) 
{
  // read clusters from the tree, if it is provided
  if (!treeRP) return 0;
  for (int ilr=fNLayersActive;ilr--;) {
    TBranch* br = treeRP->GetBranch(Form("ITSRecPoints%d",ilr));
    if (!br) AliFatal(Form("Provided cluster tree does not contain branch for layer %d",ilr));
    br->SetAddress( GetLayerActive(ilr)->GetClustersAddress() );
  }
  return treeRP->GetEntry(0); // we are still in 1 ev/tree mode...
}

Int_t FindIndex(AliITSUClusterPix **parr, Int_t i, AliITSUClusterPix *c) {
  Int_t b=0;
  AliITSUClusterPix *cc=parr[b];
  if (c->Compare(cc) <= 0) return b;

  Int_t e=b+i-1;
  cc=parr[e];
  if (c->Compare(cc) >  0) return e+1;

  Int_t m=(b+e)/2;
  for (; b<e; m=(b+e)/2) {
    cc=parr[m];
    if (c->Compare(cc) > 0) b=m+1;
    else e=m; 
  }
  return m;   
}

//______________________________________________________
void AliITSURecoDet::SortClusters(AliITSUClusterPix::SortMode_t mode)
{
  // process clsuters according to requested mode
  AliITSUClusterPix::SetSortMode( mode );
  for (int ilr=fNLayersActive;ilr--;) {
      TClonesArray *arr=GetLayerActive(ilr)->GetClusters();

      const Int_t kNcl=arr->GetEntriesFast();
      AliITSUClusterPix **parr=new AliITSUClusterPix*[kNcl];
      parr[0]=(AliITSUClusterPix *)arr->UncheckedAt(0);
      for (Int_t j=1; j<kNcl; j++) {
	  AliITSUClusterPix *c=(AliITSUClusterPix*)arr->UncheckedAt(j);
          Int_t i=FindIndex(parr,j,c);
          Int_t k=j-i;
          memmove(parr+i+1 ,parr+i,k*sizeof(AliITSUClusterPix*));
          parr[i]=c;
      }

      TObject **cont=arr->GetObjectRef();
      for (Int_t i=0; i<kNcl; i++) cont[i]=parr[i];
      delete[] parr;

  }
}

 AliITSURecoDet.cxx:1
 AliITSURecoDet.cxx:2
 AliITSURecoDet.cxx:3
 AliITSURecoDet.cxx:4
 AliITSURecoDet.cxx:5
 AliITSURecoDet.cxx:6
 AliITSURecoDet.cxx:7
 AliITSURecoDet.cxx:8
 AliITSURecoDet.cxx:9
 AliITSURecoDet.cxx:10
 AliITSURecoDet.cxx:11
 AliITSURecoDet.cxx:12
 AliITSURecoDet.cxx:13
 AliITSURecoDet.cxx:14
 AliITSURecoDet.cxx:15
 AliITSURecoDet.cxx:16
 AliITSURecoDet.cxx:17
 AliITSURecoDet.cxx:18
 AliITSURecoDet.cxx:19
 AliITSURecoDet.cxx:20
 AliITSURecoDet.cxx:21
 AliITSURecoDet.cxx:22
 AliITSURecoDet.cxx:23
 AliITSURecoDet.cxx:24
 AliITSURecoDet.cxx:25
 AliITSURecoDet.cxx:26
 AliITSURecoDet.cxx:27
 AliITSURecoDet.cxx:28
 AliITSURecoDet.cxx:29
 AliITSURecoDet.cxx:30
 AliITSURecoDet.cxx:31
 AliITSURecoDet.cxx:32
 AliITSURecoDet.cxx:33
 AliITSURecoDet.cxx:34
 AliITSURecoDet.cxx:35
 AliITSURecoDet.cxx:36
 AliITSURecoDet.cxx:37
 AliITSURecoDet.cxx:38
 AliITSURecoDet.cxx:39
 AliITSURecoDet.cxx:40
 AliITSURecoDet.cxx:41
 AliITSURecoDet.cxx:42
 AliITSURecoDet.cxx:43
 AliITSURecoDet.cxx:44
 AliITSURecoDet.cxx:45
 AliITSURecoDet.cxx:46
 AliITSURecoDet.cxx:47
 AliITSURecoDet.cxx:48
 AliITSURecoDet.cxx:49
 AliITSURecoDet.cxx:50
 AliITSURecoDet.cxx:51
 AliITSURecoDet.cxx:52
 AliITSURecoDet.cxx:53
 AliITSURecoDet.cxx:54
 AliITSURecoDet.cxx:55
 AliITSURecoDet.cxx:56
 AliITSURecoDet.cxx:57
 AliITSURecoDet.cxx:58
 AliITSURecoDet.cxx:59
 AliITSURecoDet.cxx:60
 AliITSURecoDet.cxx:61
 AliITSURecoDet.cxx:62
 AliITSURecoDet.cxx:63
 AliITSURecoDet.cxx:64
 AliITSURecoDet.cxx:65
 AliITSURecoDet.cxx:66
 AliITSURecoDet.cxx:67
 AliITSURecoDet.cxx:68
 AliITSURecoDet.cxx:69
 AliITSURecoDet.cxx:70
 AliITSURecoDet.cxx:71
 AliITSURecoDet.cxx:72
 AliITSURecoDet.cxx:73
 AliITSURecoDet.cxx:74
 AliITSURecoDet.cxx:75
 AliITSURecoDet.cxx:76
 AliITSURecoDet.cxx:77
 AliITSURecoDet.cxx:78
 AliITSURecoDet.cxx:79
 AliITSURecoDet.cxx:80
 AliITSURecoDet.cxx:81
 AliITSURecoDet.cxx:82
 AliITSURecoDet.cxx:83
 AliITSURecoDet.cxx:84
 AliITSURecoDet.cxx:85
 AliITSURecoDet.cxx:86
 AliITSURecoDet.cxx:87
 AliITSURecoDet.cxx:88
 AliITSURecoDet.cxx:89
 AliITSURecoDet.cxx:90
 AliITSURecoDet.cxx:91
 AliITSURecoDet.cxx:92
 AliITSURecoDet.cxx:93
 AliITSURecoDet.cxx:94
 AliITSURecoDet.cxx:95
 AliITSURecoDet.cxx:96
 AliITSURecoDet.cxx:97
 AliITSURecoDet.cxx:98
 AliITSURecoDet.cxx:99
 AliITSURecoDet.cxx:100
 AliITSURecoDet.cxx:101
 AliITSURecoDet.cxx:102
 AliITSURecoDet.cxx:103
 AliITSURecoDet.cxx:104
 AliITSURecoDet.cxx:105
 AliITSURecoDet.cxx:106
 AliITSURecoDet.cxx:107
 AliITSURecoDet.cxx:108
 AliITSURecoDet.cxx:109
 AliITSURecoDet.cxx:110
 AliITSURecoDet.cxx:111
 AliITSURecoDet.cxx:112
 AliITSURecoDet.cxx:113
 AliITSURecoDet.cxx:114
 AliITSURecoDet.cxx:115
 AliITSURecoDet.cxx:116
 AliITSURecoDet.cxx:117
 AliITSURecoDet.cxx:118
 AliITSURecoDet.cxx:119
 AliITSURecoDet.cxx:120
 AliITSURecoDet.cxx:121
 AliITSURecoDet.cxx:122
 AliITSURecoDet.cxx:123
 AliITSURecoDet.cxx:124
 AliITSURecoDet.cxx:125
 AliITSURecoDet.cxx:126
 AliITSURecoDet.cxx:127
 AliITSURecoDet.cxx:128
 AliITSURecoDet.cxx:129
 AliITSURecoDet.cxx:130
 AliITSURecoDet.cxx:131
 AliITSURecoDet.cxx:132
 AliITSURecoDet.cxx:133
 AliITSURecoDet.cxx:134
 AliITSURecoDet.cxx:135
 AliITSURecoDet.cxx:136
 AliITSURecoDet.cxx:137
 AliITSURecoDet.cxx:138
 AliITSURecoDet.cxx:139
 AliITSURecoDet.cxx:140
 AliITSURecoDet.cxx:141
 AliITSURecoDet.cxx:142
 AliITSURecoDet.cxx:143
 AliITSURecoDet.cxx:144
 AliITSURecoDet.cxx:145
 AliITSURecoDet.cxx:146
 AliITSURecoDet.cxx:147
 AliITSURecoDet.cxx:148
 AliITSURecoDet.cxx:149
 AliITSURecoDet.cxx:150
 AliITSURecoDet.cxx:151
 AliITSURecoDet.cxx:152
 AliITSURecoDet.cxx:153
 AliITSURecoDet.cxx:154
 AliITSURecoDet.cxx:155
 AliITSURecoDet.cxx:156
 AliITSURecoDet.cxx:157
 AliITSURecoDet.cxx:158
 AliITSURecoDet.cxx:159
 AliITSURecoDet.cxx:160
 AliITSURecoDet.cxx:161
 AliITSURecoDet.cxx:162
 AliITSURecoDet.cxx:163
 AliITSURecoDet.cxx:164
 AliITSURecoDet.cxx:165
 AliITSURecoDet.cxx:166
 AliITSURecoDet.cxx:167
 AliITSURecoDet.cxx:168
 AliITSURecoDet.cxx:169
 AliITSURecoDet.cxx:170
 AliITSURecoDet.cxx:171
 AliITSURecoDet.cxx:172
 AliITSURecoDet.cxx:173
 AliITSURecoDet.cxx:174
 AliITSURecoDet.cxx:175
 AliITSURecoDet.cxx:176
 AliITSURecoDet.cxx:177
 AliITSURecoDet.cxx:178
 AliITSURecoDet.cxx:179
 AliITSURecoDet.cxx:180
 AliITSURecoDet.cxx:181
 AliITSURecoDet.cxx:182
 AliITSURecoDet.cxx:183
 AliITSURecoDet.cxx:184
 AliITSURecoDet.cxx:185
 AliITSURecoDet.cxx:186
 AliITSURecoDet.cxx:187
 AliITSURecoDet.cxx:188
 AliITSURecoDet.cxx:189
 AliITSURecoDet.cxx:190
 AliITSURecoDet.cxx:191
 AliITSURecoDet.cxx:192
 AliITSURecoDet.cxx:193
 AliITSURecoDet.cxx:194
 AliITSURecoDet.cxx:195
 AliITSURecoDet.cxx:196
 AliITSURecoDet.cxx:197
 AliITSURecoDet.cxx:198
 AliITSURecoDet.cxx:199
 AliITSURecoDet.cxx:200
 AliITSURecoDet.cxx:201
 AliITSURecoDet.cxx:202
 AliITSURecoDet.cxx:203
 AliITSURecoDet.cxx:204
 AliITSURecoDet.cxx:205
 AliITSURecoDet.cxx:206
 AliITSURecoDet.cxx:207
 AliITSURecoDet.cxx:208
 AliITSURecoDet.cxx:209
 AliITSURecoDet.cxx:210
 AliITSURecoDet.cxx:211
 AliITSURecoDet.cxx:212
 AliITSURecoDet.cxx:213
 AliITSURecoDet.cxx:214
 AliITSURecoDet.cxx:215
 AliITSURecoDet.cxx:216
 AliITSURecoDet.cxx:217
 AliITSURecoDet.cxx:218
 AliITSURecoDet.cxx:219
 AliITSURecoDet.cxx:220
 AliITSURecoDet.cxx:221
 AliITSURecoDet.cxx:222
 AliITSURecoDet.cxx:223
 AliITSURecoDet.cxx:224
 AliITSURecoDet.cxx:225
 AliITSURecoDet.cxx:226
 AliITSURecoDet.cxx:227
 AliITSURecoDet.cxx:228
 AliITSURecoDet.cxx:229
 AliITSURecoDet.cxx:230
 AliITSURecoDet.cxx:231
 AliITSURecoDet.cxx:232
 AliITSURecoDet.cxx:233
 AliITSURecoDet.cxx:234
 AliITSURecoDet.cxx:235
 AliITSURecoDet.cxx:236
 AliITSURecoDet.cxx:237
 AliITSURecoDet.cxx:238
 AliITSURecoDet.cxx:239
 AliITSURecoDet.cxx:240
 AliITSURecoDet.cxx:241
 AliITSURecoDet.cxx:242
 AliITSURecoDet.cxx:243
 AliITSURecoDet.cxx:244
 AliITSURecoDet.cxx:245
 AliITSURecoDet.cxx:246
 AliITSURecoDet.cxx:247
 AliITSURecoDet.cxx:248
 AliITSURecoDet.cxx:249
 AliITSURecoDet.cxx:250
 AliITSURecoDet.cxx:251
 AliITSURecoDet.cxx:252
 AliITSURecoDet.cxx:253
 AliITSURecoDet.cxx:254
 AliITSURecoDet.cxx:255
 AliITSURecoDet.cxx:256
 AliITSURecoDet.cxx:257
 AliITSURecoDet.cxx:258
 AliITSURecoDet.cxx:259
 AliITSURecoDet.cxx:260
 AliITSURecoDet.cxx:261
 AliITSURecoDet.cxx:262
 AliITSURecoDet.cxx:263
 AliITSURecoDet.cxx:264
 AliITSURecoDet.cxx:265
 AliITSURecoDet.cxx:266
 AliITSURecoDet.cxx:267
 AliITSURecoDet.cxx:268
 AliITSURecoDet.cxx:269
 AliITSURecoDet.cxx:270
 AliITSURecoDet.cxx:271
 AliITSURecoDet.cxx:272
 AliITSURecoDet.cxx:273
 AliITSURecoDet.cxx:274
 AliITSURecoDet.cxx:275
 AliITSURecoDet.cxx:276
 AliITSURecoDet.cxx:277
 AliITSURecoDet.cxx:278
 AliITSURecoDet.cxx:279
 AliITSURecoDet.cxx:280
 AliITSURecoDet.cxx:281
 AliITSURecoDet.cxx:282
 AliITSURecoDet.cxx:283
 AliITSURecoDet.cxx:284
 AliITSURecoDet.cxx:285
 AliITSURecoDet.cxx:286
 AliITSURecoDet.cxx:287
 AliITSURecoDet.cxx:288
 AliITSURecoDet.cxx:289
 AliITSURecoDet.cxx:290
 AliITSURecoDet.cxx:291
 AliITSURecoDet.cxx:292
 AliITSURecoDet.cxx:293
 AliITSURecoDet.cxx:294
 AliITSURecoDet.cxx:295
 AliITSURecoDet.cxx:296
 AliITSURecoDet.cxx:297
 AliITSURecoDet.cxx:298
 AliITSURecoDet.cxx:299
 AliITSURecoDet.cxx:300
 AliITSURecoDet.cxx:301
 AliITSURecoDet.cxx:302
 AliITSURecoDet.cxx:303
 AliITSURecoDet.cxx:304