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