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