Added to TrackerGlo possibility to fill control histos with residuals,pulls,chi2
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSURecoDet.cxx
1 #include <TGeoVolume.h>
2 #include <TGeoTube.h>
3 #include <TGeoManager.h>
4 #include <TTree.h>
5 #include "AliITSURecoDet.h"
6 #include "AliITSUGeomTGeo.h"
7 #include "AliITSsegmentation.h"
8 #include "AliITSUSegmentationPix.h"
9 #include "AliITSUClusterPix.h"
10 #include "AliITSUReconstructor.h"
11
12
13
14 ClassImp(AliITSURecoDet)
15
16
17 const Char_t* AliITSURecoDet::fgkBeamPipeVolName = "IP_PIPE";
18
19
20 //______________________________________________________
21 AliITSURecoDet::AliITSURecoDet(AliITSUGeomTGeo* geom, const char* name)
22 :  fNLayers(0)
23   ,fNLayersActive(0)
24   ,fRMax(-1)
25   ,fRMin(-1)
26   ,fLayers(0)
27   ,fLayersActive(0)
28   ,fGeom(geom)
29 {
30   // def. c-tor
31   SetNameTitle(name,name);
32   fLayers.SetOwner(kTRUE);        // layers belong to this array
33   fLayersActive.SetOwner(kFALSE); // this one just points on active layers in fLayers
34   Build();
35 }
36
37 //______________________________________________________
38 AliITSURecoDet::~AliITSURecoDet()
39 {
40   // def. d-tor
41   fLayersActive.Clear(); 
42   fLayers.Clear();         // owned!
43 }
44
45 //______________________________________________________
46 void AliITSURecoDet::Print(Option_t* opt) const                       
47 {
48   //print 
49   printf("Detector %s, %d layers, %d active layers\n",GetName(),GetNLayers(),GetNLayersActive());
50   TString opts = opt; opts.ToLower();
51   if (opts.Contains("lr")) for (int i=0;i<GetNLayers();i++) GetLayer(i)->Print(opt);
52 }
53
54 //______________________________________________________
55 void AliITSURecoDet::AddLayer(const AliITSURecoLayer* lr)
56 {
57   //add new layer
58   fLayers.AddLast((TObject*)lr);
59   fNLayers++;
60   if (lr->IsActive()) {
61     fLayersActive.AddLast((TObject*)lr);
62     fNLayersActive++;
63   }
64 }
65
66 //______________________________________________________
67 Bool_t AliITSURecoDet::Build()
68 {
69   // build detector from TGeo
70   //
71   if (!fGeom) AliFatal("Geometry interface is not set");
72   int nlr = fGeom->GetNLayers();
73   if (!nlr) AliFatal("No geometry loaded");
74   //
75   // build active ITS layers
76   for (int ilr=0;ilr<nlr;ilr++) {
77     int lrTyp = fGeom->GetLayerDetTypeID(ilr);
78     // name layer according its active id, detector type and segmentation tyoe
79     AliITSURecoLayer* lra = new AliITSURecoLayer(Form("Lr%d%s%d",ilr,fGeom->GetDetTypeName(lrTyp),
80                                                       lrTyp%AliITSUGeomTGeo::kMaxSegmPerDetType),
81                                                  ilr,fGeom);
82     lra->SetPassive(kFALSE);
83     AddLayer(lra);
84   }
85   //
86   // build passive ITS layers
87   //
88   double rMin,rMax,zMin,zMax;
89   // beam pipe
90   TGeoVolume *v = gGeoManager->GetVolume(fgkBeamPipeVolName);
91   AliITSURecoLayer* lrp = 0;
92   if (!v) AliWarning("No beam pipe found in geometry");
93   {
94     TGeoTube *t=(TGeoTube*)v->GetShape();
95     rMin = t->GetRmin();
96     rMax = t->GetRmax();
97     zMin =-t->GetDz();
98     zMax = t->GetDz();
99     lrp = new AliITSURecoLayer("BeamPipe");
100     lrp->SetRMin(rMin);
101     lrp->SetRMax(rMax);
102     lrp->SetR(0.5*(rMin+rMax));
103     lrp->SetZMin(zMin);
104     lrp->SetZMax(zMax);
105     lrp->SetPassive(kTRUE);
106     AddLayer(lrp);
107     //
108   }
109   //
110   // TPC-ITS wall
111   const AliITSURecoParam* recopar = AliITSUReconstructor::GetRecoParam();
112   if (recopar) {
113     lrp = new AliITSURecoLayer("TPC-ITSwall");
114     lrp->SetRMin(AliITSUReconstructor::GetRecoParam()->GetTPCITSWallRMin());
115     lrp->SetRMax(AliITSUReconstructor::GetRecoParam()->GetTPCITSWallRMax());
116     lrp->SetR(0.5*(lrp->GetRMin()+lrp->GetRMax()));
117     lrp->SetZMin(-AliITSUReconstructor::GetRecoParam()->GetTPCITSWallZSpanH());
118     lrp->SetZMax( AliITSUReconstructor::GetRecoParam()->GetTPCITSWallZSpanH());
119     lrp->SetMaxStep( AliITSUReconstructor::GetRecoParam()->GetTPCITSWallMaxStep());
120     lrp->SetPassive(kTRUE);
121     AddLayer(lrp);
122   }
123   else {
124     AliWarning("RecoParam is not available, TPC-ITS wall is not set");
125   }
126   //
127   IndexLayers();
128   Print("lr");
129   return kTRUE;
130 }
131
132 //______________________________________________________
133 void AliITSURecoDet::IndexLayers()
134 {
135   // sort and index layers
136   const Double_t kRMargin = 1e-2; // 100 micron margin
137   fLayersActive.Sort();
138   for (int i=0;i<fNLayersActive;i++) GetLayerActive(i)->SetActiveID(i);
139   fLayers.Sort();
140   for (int i=0;i<fNLayers;i++) GetLayer(i)->SetID(i);
141   if (fNLayers>0) {
142     SetRMin(GetLayer(0)->GetRMin()-kRMargin);
143     SetRMax(GetLayer(fNLayers-1)->GetRMax()+kRMargin);
144   }
145 }
146
147 //______________________________________________________
148 Int_t AliITSURecoDet::FindLastLayerID(Double_t r, int dir) const
149 {
150   // find the last layer which the particle moving in direction dir (1:outward,-1:inward) 
151   // will traverse on its way to radius r 
152   int ilr;
153   //
154   if (dir>0) {
155     for (ilr=0;ilr<fNLayers;ilr++) {
156       AliITSURecoLayer* lr = GetLayer(ilr);
157       if ( r<lr->GetR(-dir) ) break;  // this layer at least entered
158     }
159     return --ilr;  // -1 will correspond to point below the smalles layer
160   }
161   else {
162     for (ilr=fNLayers;ilr--;) {
163       AliITSURecoLayer* lr = GetLayer(ilr);
164       if ( r>lr->GetR(-dir) ) break; // this layer at least entered
165     }
166     ilr++;
167     return ilr<fNLayers ? ilr:-1; // -1 will correspond to point above outer layer
168   }
169   //
170 }
171
172 //______________________________________________________
173 Int_t AliITSURecoDet::FindFirstLayerID(Double_t r, int dir) const
174 {
175   // find the first layer which the particle moving in direction dir (1:outward,-1:inward) 
176   // will traverse starting from radius r 
177   int ilr;
178   //
179   if (dir>0) {
180     for (ilr=0;ilr<fNLayers;ilr++) {
181       AliITSURecoLayer* lr = GetLayer(ilr);
182       if ( r<lr->GetR(dir) ) break;  // this layer at least entered
183     }
184     return ilr<fNLayers ? ilr:-1;  // -1 will correspond to point above outer leayer
185   }
186   else {
187     for (ilr=fNLayers;ilr--;) {
188       AliITSURecoLayer* lr = GetLayer(ilr);
189       if ( r>lr->GetR(dir) ) break; // this layer at least entered
190     }
191     return ilr; // -1 will correspond to point below inner layer
192   }
193   //
194 }
195
196 //______________________________________________________
197 void AliITSURecoDet::CreateClusterArrays()
198 {
199   // create cluster arrays for active layers
200   for (int ilr=0;ilr<fNLayersActive;ilr++) {
201     AliITSURecoLayer*  lr = GetLayerActive(ilr);
202     lr->SetOwnsClusterArray(kTRUE);
203     int tpDet = fGeom->GetLayerDetTypeID(ilr)/AliITSUGeomTGeo::kMaxSegmPerDetType;
204     //
205     if (tpDet == AliITSUGeomTGeo::kDetTypePix) {
206       lr->SetClusters(new TClonesArray(AliITSUClusterPix::Class()));
207     }
208     else {
209       AliFatal(Form("Unknown detector type %d",tpDet));
210     }
211     //
212   }
213   //
214 }
215
216 //_____________________________________________________________________________
217 Int_t AliITSURecoDet::LoadClusters(TTree* treeRP) 
218 {
219   // read clusters from the tree, if it is provided
220   if (!treeRP) return 0;
221   for (int ilr=fNLayersActive;ilr--;) {
222     TBranch* br = treeRP->GetBranch(Form("ITSRecPoints%d",ilr));
223     if (!br) AliFatal(Form("Provided cluster tree does not contain branch for layer %d",ilr));
224     br->SetAddress( GetLayerActive(ilr)->GetClustersAddress() );
225   }
226   return treeRP->GetEntry(0); // we are still in 1 ev/tree mode...
227 }