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