b2921705455010d794eec43fa2af291c83a9f482
[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 <AliITSgeomTGeo.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 < AliITSgeomTGeo::GetModuleIndex(1,1,1) ||
148       gid > AliITSgeomTGeo::GetNModules() - 1)
149   {
150     throw(eH + Form("%d is not valid. ID range from %d to %d", gid,
151                     firstSPD, lastSSD ));
152   }
153
154   fID = gid;
155
156   if (!fgStaticInitDone) {
157     InitStatics(fInfo);
158
159     fgSPDFrameBox->IncRefCount(this);
160     fgSPDPalette->IncRefCount();
161
162     fgSDDFrameBox->IncRefCount(this);
163     fgSDDPalette->IncRefCount();
164
165     fgSSDFrameBox->IncRefCount(this);
166     fgSSDPalette->IncRefCount();
167   }
168
169   AliITSgeomTGeo::GetModuleId(fID, fLayer, fLadder, fDet);
170   TString strLadder = "Ladder";
171   TString strSensor = "Sensor";
172   TString symname;
173   Int_t   id, nsector, nstave, nladder, rest;
174
175   if (fID <= (AliITSgeomTGeo::GetModuleIndex(3,1,1) - 1))
176   {
177     // SPD
178
179     SetFrame(fgSPDFrameBox);
180     SetPalette(fgSPDPalette);
181
182     symname += strLadder;
183     if (fID < 80)
184     {
185       nsector = fID/8;
186       rest    = fID - 8*nsector;
187       nstave  = 1;
188     }
189     else
190     {
191       id      = fID - 80;
192       nsector = id/8;
193       rest    = id - 8*nsector;
194       nstave  = 1;
195     }
196     if (rest < 4) nstave = 0;
197     rest    -= 4*nstave;
198     symname += rest;
199     SetName(symname);
200     fDetID = 0;
201     fDx = fInfo->fSegSPD->Dx()*0.00005;
202     fDz = 3.50;
203     fDy = fInfo->fSegSPD->Dy()*0.00005;
204
205   }
206   else if (fID <= (AliITSgeomTGeo::GetModuleIndex(5,1,1) - 1))
207   {
208     // SDD
209
210     SetFrame(fgSDDFrameBox);
211     SetPalette(fgSDDPalette);
212
213     symname += strSensor;
214     if (fID < 324)
215     {
216       id      = fID - 240;
217       nladder = id/6;
218       rest    = id - 6*nladder;
219     }
220     else
221     {
222       id      = fID - 324;
223       nladder = id/8;
224       rest    = id - 8*nladder;
225     }
226     symname += rest;
227     SetName(symname);
228     fDetID = 1;
229     fDx = fInfo->fSegSDD->Dx()*0.0001;
230     fDz = fInfo->fSegSDD->Dz()*0.00005;
231     fDy = fInfo->fSegSDD->Dy()*0.00005;
232
233   }
234   else
235   {
236     // SSD
237
238     SetFrame(fgSSDFrameBox);
239     SetPalette(fgSSDPalette);
240
241     symname += strSensor;
242     if (fID < 1248)
243     {
244       id      = fID - 500;
245       nladder = id/22;
246       rest    = id - nladder*22;
247     }
248     else
249     {
250       id      = fID - 1248;
251       nladder = id/25;
252       rest    = id - nladder*25;
253     }
254     symname += rest;
255     SetName(symname);
256     fDetID = 2;
257     fInfo->fSegSSD->SetLayer(fLayer);
258     fDx = fInfo->fSegSSD->Dx()*0.00005;
259     fDz = fInfo->fSegSSD->Dz()*0.00005;
260     fDy = fInfo->fSegSSD->Dy()*0.00005;
261
262   }
263
264   LoadQuads();
265   ComputeBBox();
266   if (trans)
267     SetTrans();
268 }
269
270 void AliEveITSModule::LoadQuads()
271 {
272   // Read module data from source and create low-level objects for
273   // visualization - called quads.
274
275   TClonesArray *digits  = fInfo->GetDigits(fID, fDetID);
276   Int_t         ndigits = digits ? digits->GetEntriesFast() : 0;
277
278   Float_t       x, z, dpx, dpz;
279   Int_t         i, j;
280
281   switch(fDetID)
282   {
283
284     case 0: { // SPD
285       AliITSsegmentationSPD* seg =  fInfo->fSegSPD;
286
287       Reset(kQT_RectangleXZFixedY, kFALSE, 32);
288
289       for (Int_t k=0; k<ndigits; ++k)
290       {
291         AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
292         j = d->GetCoord1();
293         i = d->GetCoord2();
294         x  = -0.5*seg->Dx() + i*seg->Dpx(0);
295         x *=  0.0001;
296         fInfo->GetSPDLocalZ(j, z);
297         dpx = seg->Dpx(i)*0.0001;
298         dpz = seg->Dpz(j)*0.0001;
299
300         AddQuad(x, z, dpx, dpz);
301         QuadValue(1); // In principle could have color based on number of neigbours
302         QuadId(d);
303       }
304       break;
305     }
306
307     case 1: { // SDD
308       AliITSsegmentationSDD *seg =  fInfo->fSegSDD;
309
310       Reset(kQT_RectangleXZFixedY, kFALSE, 32);
311
312       for (Int_t k=0; k<ndigits; ++k)
313       {
314         AliITSdigit* d = (AliITSdigit*) digits->UncheckedAt(k);
315
316         // if (d->GetSignal() > fgSDDThreshold)
317         {
318           j = d->GetCoord1();
319           i = d->GetCoord2();
320           seg->DetToLocal(i, j, x, z);
321           dpx = seg->Dpx(i)*0.0001;
322           dpz = seg->Dpz(j)*0.0001;
323
324           AddQuad(x-2*dpx, z - dpz*0.5, 4*dpx, dpz);
325           QuadValue(d->GetSignal());
326           QuadId(d);
327         }
328       }
329       break;
330     }
331
332     case 2: { // SSD
333       AliITSsegmentationSSD* seg = fInfo->fSegSSD;
334
335       Reset(kQT_LineXZFixedY, kFALSE, 32);
336
337       Float_t ap, an; // positive/negative angles -> offsets
338       seg->Angles(ap, an);
339       ap =   TMath::Tan(ap) * fDz;
340       an = - TMath::Tan(an) * fDz;
341
342       for (Int_t k=0; k<ndigits; ++k)
343       {
344         AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
345         // if(d->GetSignal() > fgSSDThreshold)
346         {
347           j = d->GetCoord1();
348           i = d->GetCoord2();
349           seg->DetToLocal(i,j,x,z);
350
351           Float_t a = ( d->GetCoord1() == 1) ? ap : an;
352
353           AddLine(x-a, -fDz, 2*a, 2*fDz);
354           QuadValue(d->GetSignal());
355           QuadId(d);
356           // printf("%3d -> %3d -> %8x\n", d->GetSignal(), ci, fQuads.back().color);
357         }
358       }
359       break;
360     }
361
362   } // end switch
363
364   RefitPlex();
365 }
366
367 /******************************************************************************/
368
369 void AliEveITSModule::SetTrans()
370 {
371   // Set transformation matrix based on module id (use geometry to
372   // retrieve this information).
373
374   fHMTrans.SetFrom(*AliITSgeomTGeo::GetMatrix(fID));
375 }
376
377 /******************************************************************************/
378
379 void AliEveITSModule::DigitSelected(Int_t idx)
380 {
381   // Override secondary select (alt-click) from TEveQuadSet.
382
383   DigitBase_t *qb  = GetDigit(idx);
384   TObject     *obj = qb->fId.GetObject();
385   AliITSdigit *d   = dynamic_cast<AliITSdigit*>(obj);
386   printf("AliEveITSModule::QuadSelected "); Print();
387   printf("  idx=%d, value=%d, obj=0x%lx, digit=0x%lx\n",
388          idx, qb->fValue, (ULong_t)obj, (ULong_t)d);
389   if (d)
390     printf("  coord1=%3d coord2=%3d signal=%d\n",
391            d->GetCoord1(), d->GetCoord2(), d->GetSignal());
392
393 }
394
395 /******************************************************************************/
396
397 void AliEveITSModule::Print(Option_t* ) const
398 {
399   // Print object summary information.
400
401   printf("AliEveITSModule: ID %d, layer %d, ladder %d, det %d\n",
402          fID, fLayer, fLadder, fDetID);
403 }