1 #include <TGeoVolume.h>
3 #include <TGeoManager.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"
14 ClassImp(AliITSURecoDet)
17 const Char_t* AliITSURecoDet::fgkBeamPipeVolName = "IP_PIPE";
20 //______________________________________________________
21 AliITSURecoDet::AliITSURecoDet(AliITSUGeomTGeo* geom, const char* name)
32 SetNameTitle(name,name);
33 fLayers.SetOwner(kTRUE); // layers belong to this array
34 fLayersActive.SetOwner(kFALSE); // this one just points on active layers in fLayers
38 //______________________________________________________
39 AliITSURecoDet::~AliITSURecoDet()
42 fLayersActive.Clear();
43 fLayers.Clear(); // owned!
46 //______________________________________________________
47 void AliITSURecoDet::Print(Option_t* opt) const
50 printf("Detector %s, %d layers, %d active layers\n",GetName(),GetNLayers(),GetNLayersActive());
51 TString opts = opt; opts.ToLower();
52 if (opts.Contains("lr")) {
53 for (int i=0;i<GetNLayers();i++) GetLayer(i)->Print(opt);
54 printf("ITS-TPC matching reference R: %.3f\n",fRITSTPCRef);
58 //______________________________________________________
59 void AliITSURecoDet::AddLayer(const AliITSURecoLayer* lr)
62 fLayers.AddLast((TObject*)lr);
65 fLayersActive.AddLast((TObject*)lr);
70 //______________________________________________________
71 Bool_t AliITSURecoDet::Build()
73 // build detector from TGeo
75 if (!fGeom) AliFatal("Geometry interface is not set");
76 int nlr = fGeom->GetNLayers();
77 if (!nlr) AliFatal("No geometry loaded");
79 // build active ITS layers
80 for (int ilr=0;ilr<nlr;ilr++) {
81 int lrTyp = fGeom->GetLayerDetTypeID(ilr);
82 // name layer according its active id, detector type and segmentation tyoe
83 AliITSURecoLayer* lra = new AliITSURecoLayer(Form("Lr%d%s%d",ilr,fGeom->GetDetTypeName(lrTyp),
84 lrTyp%AliITSUGeomTGeo::kMaxSegmPerDetType),
86 lra->SetPassive(kFALSE);
90 // build passive ITS layers
92 double rMin,rMax,zMin,zMax;
94 TGeoVolume *v = gGeoManager->GetVolume(fgkBeamPipeVolName);
95 AliITSURecoLayer* lrp = 0;
96 if (!v) AliWarning("No beam pipe found in geometry");
98 TGeoTube *t=(TGeoTube*)v->GetShape();
103 lrp = new AliITSURecoLayer("BeamPipe");
106 lrp->SetR(0.5*(rMin+rMax));
109 lrp->SetPassive(kTRUE);
115 const AliITSURecoParam* recopar = AliITSUReconstructor::GetRecoParam();
117 lrp = new AliITSURecoLayer("TPC-ITSwall");
118 lrp->SetRMin(AliITSUReconstructor::GetRecoParam()->GetTPCITSWallRMin());
119 lrp->SetRMax(AliITSUReconstructor::GetRecoParam()->GetTPCITSWallRMax());
120 lrp->SetR(0.5*(lrp->GetRMin()+lrp->GetRMax()));
121 lrp->SetZMin(-AliITSUReconstructor::GetRecoParam()->GetTPCITSWallZSpanH());
122 lrp->SetZMax( AliITSUReconstructor::GetRecoParam()->GetTPCITSWallZSpanH());
123 lrp->SetMaxStep( AliITSUReconstructor::GetRecoParam()->GetTPCITSWallMaxStep());
124 lrp->SetPassive(kTRUE);
128 AliWarning("RecoParam is not available, TPC-ITS wall is not set");
136 //______________________________________________________
137 void AliITSURecoDet::IndexLayers()
139 // sort and index layers
140 const Double_t kRMargin = 1e-2; // 100 micron margin
141 fLayersActive.Sort();
142 for (int i=0;i<fNLayersActive;i++) GetLayerActive(i)->SetActiveID(i);
144 for (int i=0;i<fNLayers;i++) GetLayer(i)->SetID(i);
146 SetRMin(GetLayer(0)->GetRMin()-kRMargin);
147 SetRMax(GetLayer(fNLayers-1)->GetRMax()+kRMargin);
150 // define the reference R for ITS/TPC matching: outside of last layer but before TPC materials
151 const double kOffsLastActR = 5.; // offset of reference layer wrt last active R
152 int lastActive = GetLrIDActive(fNLayersActive-1);
153 AliITSURecoLayer* lrA = GetLayer(lastActive); // last active
154 double rref = lrA->GetRMax() + kOffsLastActR;
156 if (lastActive < fNLayers-1) { // there are material layers outside ...
157 AliITSURecoLayer* lrL = GetLayer(lastActive+1);
158 if (lrL->GetRMin()<=rref) rref = lrL->GetRMin();
159 if (rref - lrA->GetRMax()<kOffsLastActR) {
160 AliError(Form("The ITS-TPC matching reference R=%.2f is too close to last active R=%.3f",rref,lrA->GetRMax()));
167 //______________________________________________________
168 Int_t AliITSURecoDet::FindLastLayerID(Double_t r, int dir) const
170 // find the last layer which the particle moving in direction dir (1:outward,-1:inward)
171 // will traverse on its way to radius r
175 for (ilr=0;ilr<fNLayers;ilr++) {
176 AliITSURecoLayer* lr = GetLayer(ilr);
177 if ( r<lr->GetR(-dir) ) break; // this layer at least entered
179 return --ilr; // -1 will correspond to point below the smalles layer
182 for (ilr=fNLayers;ilr--;) {
183 AliITSURecoLayer* lr = GetLayer(ilr);
184 if ( r>lr->GetR(-dir) ) break; // this layer at least entered
187 return ilr<fNLayers ? ilr:-1; // -1 will correspond to point above outer layer
192 //______________________________________________________
193 Int_t AliITSURecoDet::FindFirstLayerID(Double_t r, int dir) const
195 // find the first layer which the particle moving in direction dir (1:outward,-1:inward)
196 // will traverse starting from radius r
200 for (ilr=0;ilr<fNLayers;ilr++) {
201 AliITSURecoLayer* lr = GetLayer(ilr);
202 if ( r<lr->GetR(dir) ) break; // this layer at least entered
204 return ilr<fNLayers ? ilr:-1; // -1 will correspond to point above outer leayer
207 for (ilr=fNLayers;ilr--;) {
208 AliITSURecoLayer* lr = GetLayer(ilr);
209 if ( r>lr->GetR(dir) ) break; // this layer at least entered
211 return ilr; // -1 will correspond to point below inner layer
216 //______________________________________________________
217 void AliITSURecoDet::CreateClusterArrays()
219 // create cluster arrays for active layers
220 for (int ilr=0;ilr<fNLayersActive;ilr++) {
221 AliITSURecoLayer* lr = GetLayerActive(ilr);
222 lr->SetOwnsClusterArray(kTRUE);
223 int tpDet = fGeom->GetLayerDetTypeID(ilr)/AliITSUGeomTGeo::kMaxSegmPerDetType;
225 if (tpDet == AliITSUGeomTGeo::kDetTypePix) {
226 lr->SetClusters(new TClonesArray(AliITSUClusterPix::Class()));
229 AliFatal(Form("Unknown detector type %d",tpDet));
236 //_____________________________________________________________________________
237 Int_t AliITSURecoDet::LoadClusters(TTree* treeRP)
239 // read clusters from the tree, if it is provided
240 if (!treeRP) return 0;
241 for (int ilr=fNLayersActive;ilr--;) {
242 TBranch* br = treeRP->GetBranch(Form("ITSRecPoints%d",ilr));
243 if (!br) AliFatal(Form("Provided cluster tree does not contain branch for layer %d",ilr));
244 br->SetAddress( GetLayerActive(ilr)->GetClustersAddress() );
246 return treeRP->GetEntry(0); // we are still in 1 ev/tree mode...