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