Added classes for geometry - reconstruction interface, minor fixes in other classes
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSURecoLayer.cxx
1 #include "AliITSURecoLayer.h"
2 #include "AliITSUGeomTGeo.h"
3 #include "AliITSsegmentation.h"
4 #include "AliITSURecoSens.h"
5 #include "AliITSUAux.h"
6
7 using namespace AliITSUAux;
8 using namespace TMath;
9
10 ClassImp(AliITSURecoLayer)
11
12
13 //______________________________________________________
14 AliITSURecoLayer::AliITSURecoLayer(const char* name)
15   :fActiveID(-1)
16   ,fNSensors(0)
17   ,fNSensInLadder(0)
18   ,fNLadders(0)
19   ,fR(0)
20   ,fRMax(0)
21   ,fRMin(0)
22   ,fZMax(0)
23   ,fZMin(0)
24   ,fPhiLadMax(0)
25   ,fPhiLadMin(0)
26   ,fPhiOffs(0)
27   ,fSensDZInv(0)
28   ,fDPhiLadInv(0)
29   ,fSensors(0)
30   ,fITSGeom(0)
31   ,fkSegm(0)
32 {
33   // def. c-tor
34   SetNameTitle(name,name);
35   fSensors.SetOwner(kTRUE);
36 }
37
38 //______________________________________________________
39 AliITSURecoLayer::AliITSURecoLayer(const char* name,Int_t activeID,Int_t nsens, AliITSUGeomTGeo* gm,const AliITSsegmentation* segm)
40   :fActiveID(activeID)
41   ,fNSensors(0)
42   ,fNSensInLadder(0)
43   ,fNLadders(0)
44   ,fR(0)
45   ,fRMax(0)
46   ,fRMin(0)
47   ,fZMax(0)
48   ,fZMin(0)
49   ,fPhiLadMax(0)
50   ,fPhiLadMin(0)
51   ,fPhiOffs(0)
52   ,fSensDZInv(0)
53   ,fDPhiLadInv(0)
54   ,fSensors(nsens)
55   ,fITSGeom(gm)
56   ,fkSegm(segm)
57 {
58   // def. c-tor
59   SetNameTitle(name,name);
60   fSensors.SetOwner(kTRUE);
61 }
62
63 //______________________________________________________
64 AliITSURecoLayer::~AliITSURecoLayer()
65 {
66   // def. d-tor
67 }
68
69 //______________________________________________________
70 void AliITSURecoLayer::Print(Option_t* opt) const                             
71 {
72   //print 
73   printf("Layer %s %d (active:%+d), NSensors: %d\n",GetName(),GetID(),GetActiveID(),GetNSensors());
74   TString opts = opt; opts.ToLower();
75   if (opts.Contains("sn")) for (int i=0;i<GetNSensors();i++) GetSensor(i)->Print(opt);
76 }
77
78 //______________________________________________________
79 Bool_t AliITSURecoLayer::Build()
80 {
81   // build internal structures
82   fNLadders = fITSGeom->GetNLadders(fActiveID);
83   fNSensInLadder = fITSGeom->GetNDetectors(fActiveID);
84   //
85   // name layer according its active id, detector type and segmentation tyoe
86   TGeoHMatrix mmod;
87   const TGeoHMatrix* mt2l;
88   fRMin=fZMin=1e9;
89   fRMax=fZMax=-1e9;
90   double phiTF,rTF, loc[3]={0,0,0},glo[3];
91   fNSensors = 0;
92   fPhiLadMin = new Double_t[fNLadders];
93   fPhiLadMax = new Double_t[fNLadders];
94   fSensDZInv = 0;
95   //
96   for (int ild=0;ild<fNLadders;ild++) {
97     fPhiLadMin[ild] = 1e9;
98     fPhiLadMax[ild] = -1e9;
99     //
100     for (int idt=0;idt<fNSensInLadder;idt++) {
101       AliITSURecoSens* sens = new AliITSURecoSens(fNSensors++);
102       fSensors.AddLast(sens);
103       //
104       double phiMin=1e9,phiMax=-1e9,zMin=1e9,zMax=-1e9;
105       mmod = *fITSGeom->GetMatrix(fActiveID,ild,idt);
106       for (int ix=0;ix<2;ix++) {
107         loc[0] = (ix-0.5)*fkSegm->Dx(); // +-DX/2
108         for (int iy=0;iy<2;iy++) {
109           loc[1] = (iy-0.5)*fkSegm->Dy(); // +-DY/2
110           for (int iz=0;iz<2;iz++) {
111             loc[2] = (iz-0.5)*fkSegm->Dz(); // +-DZ/2
112             //
113             mmod.LocalToMaster(loc,glo);
114             double phi = ATan2(glo[1],glo[0]);
115             double r   = glo[0]*glo[0] + glo[1]*glo[1];
116             if (fRMin>r) fRMin = r;
117             if (fRMax<r) fRMax = r;
118             BringTo02Pi(phi);
119             if      (phiMin>1e8) phiMin=phi; 
120             else if (!OKforPhiMin(phiMin,phi)) phiMin=phi;
121             if      (phiMax<-1e8) phiMax=phi;
122             else if (!OKforPhiMax(phiMax,phi)) phiMax=phi;            
123             if (glo[2]>zMax) zMax=glo[2]; else if (glo[2]<zMin) zMin=glo[2];
124           }
125         }
126       }
127       printf("%d %d (%d)  %f %f\n",ild,idt, ild*fNSensInLadder+idt,phiMin,phiMax);
128
129       sens->SetBoundaries(phiMin,phiMax,zMin,zMax);
130       mt2l = fITSGeom->GetMatrixT2L(fActiveID,ild,idt);
131       mmod.Multiply(mt2l);      
132       loc[0]=loc[1]=loc[2]=0;
133       mmod.LocalToMaster(loc,glo);
134       rTF   = Sqrt(glo[0]*glo[0] + glo[1]*glo[1]);  //  tracking params (misaligned)
135       phiTF = ATan2(glo[1],glo[0]);
136       BringTo02Pi(phiTF);
137       //
138       sens->SetXTF(rTF);
139       sens->SetPhiTF(phiTF);
140       //
141       if      (fPhiLadMin[ild]>1e8)  fPhiLadMin[ild] = phiMin;
142       else if (!OKforPhiMin(fPhiLadMin[ild],phiMin)) fPhiLadMin[ild] = phiMin;
143       if      (fPhiLadMax[ild]<-1e8) fPhiLadMax[ild] = phiMax;
144       else if (!OKforPhiMax(fPhiLadMax[ild],phiMax)) fPhiLadMax[ild] = phiMax;
145       if (fZMin>zMin) fZMin = zMin;
146       if (fZMax<zMax) fZMax = zMax;
147       //
148       if (idt>0) fSensDZInv += zMax - GetSensor(fNSensors-2)->GetZMax(); // z interval to previoud
149     }
150   }
151   //
152   fRMin = Sqrt(fRMin);
153   fRMax = Sqrt(fRMax);
154   fR = 0.5*(fRMin+fRMax);
155   double dz = fNSensInLadder>0 ? fSensDZInv/(fNSensInLadder-1)/fNLadders : fZMax-fZMin;
156   fSensDZInv = 1./dz;
157
158   const int kNBId[3][3] = { 
159     {AliITSURecoSens::kNghbBL,AliITSURecoSens::kNghbB,AliITSURecoSens::kNghbBR},
160     {AliITSURecoSens::kNghbL,          -1            ,AliITSURecoSens::kNghbR },
161     {AliITSURecoSens::kNghbTL,AliITSURecoSens::kNghbT,AliITSURecoSens::kNghbTR}
162   };
163
164   // add neighbours info
165   double zTol = 0.45*dz, phiTol = 0.45*TwoPi()/fNLadders;
166   for (int ild=0;ild<fNLadders;ild++) {
167     for (int idt=0;idt<fNSensInLadder;idt++) {
168       AliITSURecoSens* sens = GetSensor(ild,idt);
169       //
170       for (int ils=-1;ils<=1;ils++) {
171         int ildN = ild+ils;  // ladders of neighbouring sensors
172         if (ildN<0) ildN = fNLadders-1; else if (ildN==fNLadders) ildN = 0;
173         for (int ids=-1;ids<=1;ids++) {
174           int idtN = idt+ids;
175           if (idtN<0 || idtN==fNSensInLadder || (ids==0&&ils==0)) continue;
176           AliITSURecoSens* sensN = GetSensor(ildN,idtN); // potential neighbor
177           int neighbID = ildN*fNSensInLadder+idtN;
178           //      
179           int zType = 1;  // side
180           if (sens->GetZMin()-zTol>sensN->GetZMax()) continue; // too large distance
181           if (sensN->GetZMin()-zTol>sens->GetZMax()) continue; // too large distance
182           if      (sens->GetZMin()-zTol>sensN->GetZMin()) zType =  0;     // bottom
183           else if (sensN->GetZMin()-zTol>sens->GetZMin()) zType =  2;     // top
184           //
185           int phiType = 1;
186           double phiTstMn = sensN->GetPhiMin()-phiTol;
187           BringTo02Pi(phiTstMn);
188           if (!OKforPhiMax(sens->GetPhiMax(),phiTstMn)) continue; // too large angle      
189           double phiTstMx = sensN->GetPhiMax()+phiTol;    
190           BringTo02Pi(phiTstMx);
191           if (!OKforPhiMin(sens->GetPhiMin(),phiTstMx)) continue; // too large angle
192           //
193           phiTstMn = sensN->GetPhiMin()+phiTol;
194           BringTo02Pi(phiTstMn);
195           phiTstMx = sensN->GetPhiMax()-phiTol;   
196           BringTo02Pi(phiTstMx);
197           if      (!OKforPhiMax(sens->GetPhiMax(),phiTstMx)) phiType = 0; // left
198           else if (!OKforPhiMin(sens->GetPhiMin(),phiTstMn)) phiType = 2; // right
199           //
200           sens->SetNeighborID(kNBId[zType][phiType], neighbID);
201         } // phi scan
202       } // z scan
203     } // sensors
204   } // ladders
205   //
206   //
207   return kTRUE;
208 }
209
210 //______________________________________________________
211 void AliITSURecoLayer::AddSensor(const AliITSURecoSens* mod)
212 {
213   //add new module
214   fSensors.AddLast((TObject*)mod);
215   fNSensors++;
216 }
217
218 //______________________________________________________
219 Int_t AliITSURecoLayer::FindSensors(const double* impPar, AliITSURecoSens **sensors)
220 {
221   // find sensors having intersection with track
222   // impPar contains: lab phi of track, dphi, labZ, dz
223   double z = impPar[2];
224   if (z>fZMax+impPar[3]) return -1; // outside of Z coverage
225   z -= fZMin;
226   if (z<-impPar[3]) return -1; // outside of Z coverage
227   int sensInLad = int(z*fSensDZInv);
228   //
229   double phi = impPar[0] - fPhiOffs;
230   BringTo02Pi(phi);
231   int ladID = int(phi*fDPhiLadInv);  // ladder id
232   int nsens = 0;
233   //
234   AliITSURecoSens* sensN,*sens = GetSensor(ladID*fNSensInLadder+sensInLad);
235   sensors[nsens++] = sens;
236   // check neighbours
237   double zMn=impPar[2]-impPar[3], zMx=impPar[2]+impPar[3], phiMn=impPar[0]-impPar[1], phiMx=impPar[0]+impPar[1];
238   BringTo02Pi(phiMn);
239   BringTo02Pi(phiMx);
240   //
241   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbR)); // neighbor on the right
242   if (sensN && OKforPhiMax(phiMx,sensN->GetPhiMin())) sensors[nsens++] = sensN;
243   //
244   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbTR)); // neighbor on the top right
245   if (sensN && OKforPhiMax(phiMx,sensN->GetPhiMin()) && sensN->GetZMin()<zMx) sensors[nsens++] = sensN;
246   //
247   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbT)); // neighbor on the top
248   if (sensN && sensN->GetZMin()>zMx) sensors[nsens++] = sensN;
249   //
250   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbTL)); // neighbor on the top left
251   if (sensN && OKforPhiMin(phiMn,sensN->GetPhiMax()) && sensN->GetZMin()<zMx) sensors[nsens++] = sensN;
252   //
253   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbL)); // neighbor on the left
254   if (sensN && OKforPhiMin(phiMn,sensN->GetPhiMax())) sensors[nsens++] = sensN;
255   //
256   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbBL)); // neighbor on the bottom left
257   if (sensN && OKforPhiMin(phiMn,sensN->GetPhiMax()) && sensN->GetZMax()>zMn) sensors[nsens++] = sensN;
258   //
259   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbB));  // neighbor on the bottom
260   if (sensN && sensN->GetZMax()>zMn) sensors[nsens++] = sensN;
261   //
262   sensN = GetSensor(sens->GetNeighborID(AliITSURecoSens::kNghbBR)); // neighbor on the bottom right
263   if (sensN && OKforPhiMax(phiMx,sensN->GetPhiMin()) && sensN->GetZMax()>zMn) sensors[nsens++] = sensN;
264   //
265   return nsens;
266 }
267