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