]>
Commit | Line | Data |
---|---|---|
5a5a1232 | 1 | #include "ITSModule.h" |
2 | ||
3 | #include <AliITSdigitSPD.h> | |
4 | #include <AliITSdigitSDD.h> | |
5 | #include <AliITSdigitSSD.h> | |
6 | ||
7 | #include <TStyle.h> | |
5a5a1232 | 8 | using namespace Alieve; |
5a5a1232 | 9 | |
9efc978d | 10 | |
11 | Bool_t ITSModule::fgStaticInitDone = kFALSE; | |
12 | ||
84aff7a4 | 13 | TEveFrameBox* ITSModule::fgSPDFrameBox = 0; |
14 | TEveFrameBox* ITSModule::fgSDDFrameBox = 0; | |
15 | TEveFrameBox* ITSModule::fgSSDFrameBox = 0; | |
9efc978d | 16 | |
84aff7a4 | 17 | TEveRGBAPalette* ITSModule::fgSPDPalette = 0; |
18 | TEveRGBAPalette* ITSModule::fgSDDPalette = 0; | |
19 | TEveRGBAPalette* ITSModule::fgSSDPalette = 0; | |
9efc978d | 20 | |
21 | //__________________________________________________________________________ | |
22 | // ITSModule | |
23 | // | |
24 | // | |
5a5a1232 | 25 | |
26 | ClassImp(ITSModule) | |
27 | ||
28 | /**************************************************************************/ | |
29 | ||
9efc978d | 30 | ITSModule::ITSModule(const Text_t* n, const Text_t* t) : |
84aff7a4 | 31 | TEveQuadSet(n, t), |
265ecb21 | 32 | fInfo(0), |
33 | fID(-1), fDetID(-1), | |
34 | fLayer(-1), fLadder(-1), fDet(-1), | |
9efc978d | 35 | fDx(0), fDz(0), fDy(0) |
27db2029 | 36 | {} |
5a5a1232 | 37 | |
9c8221e9 | 38 | ITSModule::ITSModule(Int_t gid, ITSDigitsInfo* info) : |
84aff7a4 | 39 | TEveQuadSet(Form("ITS module %d", gid)), |
27db2029 | 40 | fInfo (0), |
265ecb21 | 41 | fID(-1), fDetID(-1), |
42 | fLayer(-1), fLadder(-1), fDet(-1), | |
9efc978d | 43 | fDx(0), fDz(0), fDy(0) |
5a5a1232 | 44 | { |
27db2029 | 45 | SetDigitsInfo(info); |
9c8221e9 | 46 | SetID(gid); |
5a5a1232 | 47 | } |
48 | ||
49 | ITSModule::~ITSModule() | |
50 | { | |
51 | if(fInfo) fInfo->DecRefCount(); | |
52 | } | |
53 | ||
54 | /**************************************************************************/ | |
55 | ||
9efc978d | 56 | void ITSModule::InitStatics(ITSDigitsInfo* info) |
57 | { | |
58 | if (fgStaticInitDone) return; | |
9c8221e9 | 59 | fgStaticInitDone = kTRUE; |
9efc978d | 60 | |
61 | { | |
62 | Float_t dx = info->fSegSPD->Dx()*0.00005; | |
97e1e1bc | 63 | Float_t dz = 3.50; |
9efc978d | 64 | |
84aff7a4 | 65 | fgSPDFrameBox = new TEveFrameBox(); |
9efc978d | 66 | fgSPDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz); |
67 | fgSPDFrameBox->SetFrameColor((Color_t) 31); | |
32e219c2 | 68 | fgSPDFrameBox->SetFrameFill(kTRUE); |
69 | fgSPDFrameBox->IncRefCount(); | |
84aff7a4 | 70 | fgSPDPalette = new TEveRGBAPalette(info->fSPDMinVal,info->fSPDMaxVal); |
32e219c2 | 71 | fgSPDPalette->IncRefCount(); |
9efc978d | 72 | } |
73 | ||
74 | { | |
75 | Float_t dx = info->fSegSDD->Dx()*0.0001; | |
76 | Float_t dz = info->fSegSDD->Dz()*0.00005; | |
77 | ||
84aff7a4 | 78 | fgSDDFrameBox = new TEveFrameBox(); |
9efc978d | 79 | fgSDDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz); |
80 | fgSDDFrameBox->SetFrameColor((Color_t) 32); | |
32e219c2 | 81 | fgSDDFrameBox->SetFrameFill(kTRUE); |
82 | fgSDDFrameBox->IncRefCount(); | |
84aff7a4 | 83 | fgSDDPalette = new TEveRGBAPalette(info->fSDDMinVal,info->fSDDMaxVal); |
32e219c2 | 84 | fgSDDPalette->SetLimits(0, info->fSDDHighLim); // Set proper ADC range. |
85 | fgSDDPalette->IncRefCount(); | |
9efc978d | 86 | } |
87 | ||
88 | { | |
89 | Float_t dx = info->fSegSSD->Dx()*0.00005; | |
90 | Float_t dz = info->fSegSSD->Dz()*0.00005; | |
91 | ||
84aff7a4 | 92 | fgSSDFrameBox = new TEveFrameBox(); |
9efc978d | 93 | fgSSDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz); |
94 | fgSSDFrameBox->SetFrameColor((Color_t) 33); | |
32e219c2 | 95 | fgSSDFrameBox->SetFrameFill(kTRUE); |
96 | fgSSDFrameBox->IncRefCount(); | |
84aff7a4 | 97 | fgSSDPalette = new TEveRGBAPalette(info->fSSDMinVal,info->fSSDMaxVal); |
32e219c2 | 98 | fgSSDPalette->SetLimits(0, info->fSSDHighLim); // Set proper ADC range. |
99 | fgSSDPalette->IncRefCount(); | |
9efc978d | 100 | } |
101 | ||
102 | } | |
103 | ||
104 | /**************************************************************************/ | |
105 | ||
9c8221e9 | 106 | void ITSModule::SetDigitsInfo(ITSDigitsInfo* info) |
5a5a1232 | 107 | { |
9c8221e9 | 108 | if (fInfo == info) return; |
109 | if (fInfo) fInfo->DecRefCount(); | |
110 | fInfo = info; | |
111 | if (fInfo) fInfo->IncRefCount(); | |
112 | } | |
113 | ||
114 | /**************************************************************************/ | |
115 | ||
97e1e1bc | 116 | void ITSModule::SetID(Int_t gid, Bool_t trans) |
9c8221e9 | 117 | { |
84aff7a4 | 118 | static const TEveException eH("ITSModule::SetID "); |
9efc978d | 119 | |
9c8221e9 | 120 | if(fInfo == 0) |
121 | throw(eH + "ITSDigitsInfo not set."); | |
122 | ||
123 | if (gid < fInfo->fGeom->GetStartSPD() || gid > fInfo->fGeom->GetLastSSD()) | |
124 | throw(eH + Form("%d is not valid. ID range from %d to %d", gid, | |
1d3c2b09 | 125 | fInfo->fGeom->GetStartSPD(), fInfo->fGeom->GetLastSSD())); |
9c8221e9 | 126 | |
127 | fID = gid; | |
128 | ||
1d3c2b09 | 129 | if (!fgStaticInitDone) { |
130 | InitStatics(fInfo); | |
131 | ||
132 | fgSPDFrameBox->IncRefCount(this); | |
133 | fgSPDPalette->IncRefCount(); | |
134 | ||
135 | fgSDDFrameBox->IncRefCount(this); | |
136 | fgSDDPalette->IncRefCount(); | |
137 | ||
138 | fgSSDFrameBox->IncRefCount(this); | |
139 | fgSSDPalette->IncRefCount(); | |
140 | } | |
9c8221e9 | 141 | |
142 | fInfo->fGeom->GetModuleId(fID, fLayer, fLadder, fDet); | |
ba6cfb13 | 143 | TString strLadder = "Ladder"; |
144 | TString strSensor = "Sensor"; | |
145 | TString symname; | |
9c8221e9 | 146 | Int_t id, nsector, nstave, nladder, rest; |
ba6cfb13 | 147 | |
9efc978d | 148 | if (fID <= fInfo->fGeom->GetLastSPD()) |
149 | { | |
150 | // SPD | |
151 | ||
9c8221e9 | 152 | SetFrame(fgSPDFrameBox); |
153 | SetPalette(fgSPDPalette); | |
154 | ||
9efc978d | 155 | symname += strLadder; |
156 | if (fID < 80) | |
157 | { | |
ba6cfb13 | 158 | nsector = fID/8; |
9efc978d | 159 | rest = fID - 8*nsector; |
160 | nstave = 1; | |
161 | } | |
162 | else | |
163 | { | |
164 | id = fID - 80; | |
ba6cfb13 | 165 | nsector = id/8; |
9efc978d | 166 | rest = id - 8*nsector; |
167 | nstave = 1; | |
ba6cfb13 | 168 | } |
9efc978d | 169 | if (rest < 4) nstave = 0; |
170 | rest -= 4*nstave; | |
171 | symname += rest; | |
172 | SetName(symname); | |
173 | fDetID = 0; | |
174 | fDx = fInfo->fSegSPD->Dx()*0.00005; | |
97e1e1bc | 175 | fDz = 3.50; |
9efc978d | 176 | fDy = fInfo->fSegSPD->Dy()*0.00005; |
177 | ||
5a5a1232 | 178 | } |
9efc978d | 179 | else if (fID <= fInfo->fGeom->GetLastSDD()) |
180 | { | |
181 | // SDD | |
182 | ||
9c8221e9 | 183 | SetFrame(fgSDDFrameBox); |
184 | SetPalette(fgSDDPalette); | |
185 | ||
9efc978d | 186 | symname += strSensor; |
187 | if (fID < 324) | |
188 | { | |
189 | id = fID - 240; | |
ba6cfb13 | 190 | nladder = id/6; |
9efc978d | 191 | rest = id - 6*nladder; |
192 | } | |
193 | else | |
194 | { | |
195 | id = fID - 324; | |
ba6cfb13 | 196 | nladder = id/8; |
9efc978d | 197 | rest = id - 8*nladder; |
ba6cfb13 | 198 | } |
9efc978d | 199 | symname += rest; |
200 | SetName(symname); | |
201 | fDetID = 1; | |
202 | fDx = fInfo->fSegSDD->Dx()*0.0001; | |
203 | fDz = fInfo->fSegSDD->Dz()*0.00005; | |
204 | fDy = fInfo->fSegSDD->Dy()*0.00005; | |
205 | ||
5a5a1232 | 206 | } |
9efc978d | 207 | else |
208 | { | |
209 | // SSD | |
210 | ||
9c8221e9 | 211 | SetFrame(fgSSDFrameBox); |
212 | SetPalette(fgSSDPalette); | |
213 | ||
9efc978d | 214 | symname += strSensor; |
215 | if (fID < 1248) | |
216 | { | |
217 | id = fID - 500; | |
ba6cfb13 | 218 | nladder = id/22; |
9efc978d | 219 | rest = id - nladder*22; |
220 | } | |
221 | else | |
222 | { | |
223 | id = fID - 1248; | |
ba6cfb13 | 224 | nladder = id/25; |
9efc978d | 225 | rest = id - nladder*25; |
ba6cfb13 | 226 | } |
9efc978d | 227 | symname += rest; |
228 | SetName(symname); | |
229 | fDetID = 2; | |
230 | fInfo->fSegSSD->SetLayer(fLayer); | |
231 | fDx = fInfo->fSegSSD->Dx()*0.00005; | |
232 | fDz = fInfo->fSegSSD->Dz()*0.00005; | |
233 | fDy = fInfo->fSegSSD->Dy()*0.00005; | |
234 | ||
5a5a1232 | 235 | } |
236 | ||
237 | LoadQuads(); | |
238 | ComputeBBox(); | |
97e1e1bc | 239 | if (trans) |
240 | SetTrans(); | |
5a5a1232 | 241 | } |
242 | ||
243 | void ITSModule::LoadQuads() | |
244 | { | |
9efc978d | 245 | // Here we still use 'z' for the name of axial coordinates. |
246 | // The transforamtion matrix aplied rotates y -> z. | |
84aff7a4 | 247 | // We need this as TEveQuadSet offers optimized treatment for |
9efc978d | 248 | // quads in the x-y plane. |
249 | ||
5a5a1232 | 250 | // printf("its module load quads \n"); |
9efc978d | 251 | |
b3bc5327 | 252 | TClonesArray *digits = fInfo->GetDigits(fID, fDetID); |
253 | Int_t ndigits = digits ? digits->GetEntriesFast() : 0; | |
254 | ||
9efc978d | 255 | Float_t x, z, dpx, dpz; |
b3bc5327 | 256 | Int_t i, j; |
5a5a1232 | 257 | |
9efc978d | 258 | switch(fDetID) |
259 | { | |
260 | ||
261 | case 0: { // SPD | |
262 | AliITSsegmentationSPD* seg = fInfo->fSegSPD; | |
263 | ||
84aff7a4 | 264 | Reset(kQT_RectangleXZFixedY, kFALSE, 32); |
5a5a1232 | 265 | |
9efc978d | 266 | for (Int_t k=0; k<ndigits; ++k) |
267 | { | |
b3bc5327 | 268 | AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k); |
5a5a1232 | 269 | j = d->GetCoord1(); |
270 | i = d->GetCoord2(); | |
9efc978d | 271 | x = -0.5*seg->Dx() + i*seg->Dpx(0); |
272 | x *= 0.0001; | |
273 | fInfo->GetSPDLocalZ(j, z); | |
5a5a1232 | 274 | dpx = seg->Dpx(i)*0.0001; |
275 | dpz = seg->Dpz(j)*0.0001; | |
276 | ||
9efc978d | 277 | AddQuad(x, z, dpx, dpz); |
278 | QuadValue(1); // In principle could have color based on number of neigbours | |
ffa36681 | 279 | QuadId(d); |
5a5a1232 | 280 | } |
9efc978d | 281 | break; |
5a5a1232 | 282 | } |
5a5a1232 | 283 | |
9efc978d | 284 | case 1: { // SDD |
285 | AliITSsegmentationSDD *seg = fInfo->fSegSDD; | |
5a5a1232 | 286 | |
84aff7a4 | 287 | Reset(kQT_RectangleXZFixedY, kFALSE, 32); |
9efc978d | 288 | |
289 | for (Int_t k=0; k<ndigits; ++k) | |
290 | { | |
b3bc5327 | 291 | AliITSdigit* d = (AliITSdigit*) digits->UncheckedAt(k); |
9efc978d | 292 | |
293 | // if (d->GetSignal() > fgSDDThreshold) | |
294 | { | |
295 | j = d->GetCoord1(); | |
296 | i = d->GetCoord2(); | |
297 | seg->DetToLocal(i, j, x, z); | |
298 | dpx = seg->Dpx(i)*0.0001; | |
299 | dpz = seg->Dpz(j)*0.0001; | |
300 | ||
97e1e1bc | 301 | AddQuad(x-2*dpx, z - dpz*0.5, 4*dpx, dpz); |
9efc978d | 302 | QuadValue(d->GetSignal()); |
ffa36681 | 303 | QuadId(d); |
5a5a1232 | 304 | } |
9efc978d | 305 | } |
306 | break; | |
307 | } | |
308 | ||
309 | case 2: { // SSD | |
310 | AliITSsegmentationSSD* seg = fInfo->fSegSSD; | |
311 | ||
84aff7a4 | 312 | Reset(kQT_LineXZFixedY, kFALSE, 32); |
9efc978d | 313 | |
314 | Float_t ap, an; // positive/negative angles -> offsets | |
315 | seg->Angles(ap, an); | |
316 | ap = TMath::Tan(ap) * fDz; | |
317 | an = - TMath::Tan(an) * fDz; | |
318 | ||
319 | for (Int_t k=0; k<ndigits; ++k) | |
320 | { | |
b3bc5327 | 321 | AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k); |
9efc978d | 322 | // if(d->GetSignal() > fgSSDThreshold) |
323 | { | |
324 | j = d->GetCoord1(); | |
325 | i = d->GetCoord2(); | |
326 | seg->DetToLocal(i,j,x,z); | |
327 | ||
328 | Float_t a = ( d->GetCoord1() == 1) ? ap : an; | |
329 | ||
e974c097 | 330 | AddLine(x-a, -fDz, 2*a, 2*fDz); |
9efc978d | 331 | QuadValue(d->GetSignal()); |
ffa36681 | 332 | QuadId(d); |
9efc978d | 333 | // printf("%3d -> %3d -> %8x\n", d->GetSignal(), ci, fQuads.back().color); |
5a5a1232 | 334 | } |
5a5a1232 | 335 | } |
9efc978d | 336 | break; |
5a5a1232 | 337 | } |
5a5a1232 | 338 | |
9efc978d | 339 | } // end switch |
340 | ||
341 | RefitPlex(); | |
5a5a1232 | 342 | } |
343 | ||
344 | /**************************************************************************/ | |
345 | ||
346 | void ITSModule::SetTrans() | |
347 | { | |
4852ff6f | 348 | // Set transformation matrix based on module id (use geometry to |
349 | // retrieve this information). | |
350 | ||
9efc978d | 351 | Double_t x[9]; |
352 | fHMTrans.UnitTrans(); | |
353 | ||
4852ff6f | 354 | // !!!! Here should use AliITSgeomTGeo ... but can i be sure |
355 | // the geometry has been loaded? | |
356 | ||
357 | // column major | |
9efc978d | 358 | fInfo->fGeom->GetRotMatrix(fID, x); |
359 | fHMTrans.SetBaseVec(1, x[0], x[3], x[6]); | |
360 | fHMTrans.SetBaseVec(2, x[1], x[4], x[7]); | |
361 | fHMTrans.SetBaseVec(3, x[2], x[5], x[8]); | |
362 | // translation | |
363 | fInfo->fGeom->GetTrans(fID, x); | |
364 | fHMTrans.SetBaseVec(4, x); | |
5a5a1232 | 365 | } |
366 | ||
367 | /**************************************************************************/ | |
368 | ||
32e219c2 | 369 | void ITSModule::DigitSelected(Int_t idx) |
ffa36681 | 370 | { |
84aff7a4 | 371 | // Override control-click from TEveQuadSet |
ffa36681 | 372 | |
84aff7a4 | 373 | DigitBase_t* qb = GetDigit(idx); |
ffa36681 | 374 | TObject* obj = qb->fId.GetObject(); |
375 | AliITSdigit* d = dynamic_cast<AliITSdigit*>(obj); | |
376 | printf("ITSModule::QuadSelected "); Print(); | |
377 | printf(" idx=%d, value=%d, obj=0x%lx, digit=0x%lx\n", | |
378 | idx, qb->fValue, (ULong_t)obj, (ULong_t)d); | |
379 | if (d) | |
380 | printf(" coord1=%3d coord2=%3d signal=%d\n", | |
381 | d->GetCoord1(), d->GetCoord2(), d->GetSignal()); | |
382 | ||
383 | } | |
384 | ||
385 | /**************************************************************************/ | |
386 | ||
5a5a1232 | 387 | void ITSModule::Print(Option_t* ) const |
388 | { | |
389 | printf("ID %d, layer %d, ladder %d, det %d \n", fID, fLayer, fLadder, fDetID); | |
390 | } |