2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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 **************************************************************************/
10 #include "AliEveITSModule.h"
12 #include <AliITSgeom.h>
13 #include <AliITSsegmentationSPD.h>
14 #include <AliITSsegmentationSDD.h>
15 #include <AliITSsegmentationSSD.h>
17 #include <AliITSdigitSPD.h>
18 #include <AliITSdigitSDD.h>
19 #include <AliITSdigitSSD.h>
24 Bool_t AliEveITSModule::fgStaticInitDone = kFALSE;
26 TEveFrameBox* AliEveITSModule::fgSPDFrameBox = 0;
27 TEveFrameBox* AliEveITSModule::fgSDDFrameBox = 0;
28 TEveFrameBox* AliEveITSModule::fgSSDFrameBox = 0;
30 TEveRGBAPalette* AliEveITSModule::fgSPDPalette = 0;
31 TEveRGBAPalette* AliEveITSModule::fgSDDPalette = 0;
32 TEveRGBAPalette* AliEveITSModule::fgSSDPalette = 0;
34 //______________________________________________________________________________
39 ClassImp(AliEveITSModule)
41 /******************************************************************************/
43 AliEveITSModule::AliEveITSModule(const Text_t* n, const Text_t* t) :
47 fLayer(-1), fLadder(-1), fDet(-1),
48 fDx(0), fDz(0), fDy(0)
51 AliEveITSModule::AliEveITSModule(Int_t gid, AliEveITSDigitsInfo* info) :
52 TEveQuadSet(Form("ITS module %d", gid)),
55 fLayer(-1), fLadder(-1), fDet(-1),
56 fDx(0), fDz(0), fDy(0)
62 AliEveITSModule::~AliEveITSModule()
64 if(fInfo) fInfo->DecRefCount();
67 /******************************************************************************/
69 void AliEveITSModule::InitStatics(AliEveITSDigitsInfo* info)
71 if (fgStaticInitDone) return;
72 fgStaticInitDone = kTRUE;
75 Float_t dx = info->fSegSPD->Dx()*0.00005;
78 fgSPDFrameBox = new TEveFrameBox();
79 fgSPDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz);
80 fgSPDFrameBox->SetFrameColor((Color_t) 31);
81 fgSPDFrameBox->SetFrameFill(kTRUE);
82 fgSPDFrameBox->IncRefCount();
83 fgSPDPalette = new TEveRGBAPalette(info->fSPDMinVal,info->fSPDMaxVal);
84 fgSPDPalette->IncRefCount();
88 Float_t dx = info->fSegSDD->Dx()*0.0001;
89 Float_t dz = info->fSegSDD->Dz()*0.00005;
91 fgSDDFrameBox = new TEveFrameBox();
92 fgSDDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz);
93 fgSDDFrameBox->SetFrameColor((Color_t) 32);
94 fgSDDFrameBox->SetFrameFill(kTRUE);
95 fgSDDFrameBox->IncRefCount();
96 fgSDDPalette = new TEveRGBAPalette(info->fSDDMinVal,info->fSDDMaxVal);
97 fgSDDPalette->SetLimits(0, info->fSDDHighLim); // Set proper ADC range.
98 fgSDDPalette->IncRefCount();
102 Float_t dx = info->fSegSSD->Dx()*0.00005;
103 Float_t dz = info->fSegSSD->Dz()*0.00005;
105 fgSSDFrameBox = new TEveFrameBox();
106 fgSSDFrameBox->SetAAQuadXZ(-dx, 0, -dz, 2*dx, 2*dz);
107 fgSSDFrameBox->SetFrameColor((Color_t) 33);
108 fgSSDFrameBox->SetFrameFill(kTRUE);
109 fgSSDFrameBox->IncRefCount();
110 fgSSDPalette = new TEveRGBAPalette(info->fSSDMinVal,info->fSSDMaxVal);
111 fgSSDPalette->SetLimits(0, info->fSSDHighLim); // Set proper ADC range.
112 fgSSDPalette->IncRefCount();
117 /******************************************************************************/
119 void AliEveITSModule::SetDigitsInfo(AliEveITSDigitsInfo* info)
121 if (fInfo == info) return;
122 if (fInfo) fInfo->DecRefCount();
124 if (fInfo) fInfo->IncRefCount();
127 /******************************************************************************/
129 void AliEveITSModule::SetID(Int_t gid, Bool_t trans)
131 static const TEveException eH("AliEveITSModule::SetID ");
134 throw(eH + "AliEveITSDigitsInfo not set.");
136 if (gid < fInfo->fGeom->GetStartSPD() || gid > fInfo->fGeom->GetLastSSD())
137 throw(eH + Form("%d is not valid. ID range from %d to %d", gid,
138 fInfo->fGeom->GetStartSPD(), fInfo->fGeom->GetLastSSD()));
142 if (!fgStaticInitDone) {
145 fgSPDFrameBox->IncRefCount(this);
146 fgSPDPalette->IncRefCount();
148 fgSDDFrameBox->IncRefCount(this);
149 fgSDDPalette->IncRefCount();
151 fgSSDFrameBox->IncRefCount(this);
152 fgSSDPalette->IncRefCount();
155 fInfo->fGeom->GetModuleId(fID, fLayer, fLadder, fDet);
156 TString strLadder = "Ladder";
157 TString strSensor = "Sensor";
159 Int_t id, nsector, nstave, nladder, rest;
161 if (fID <= fInfo->fGeom->GetLastSPD())
165 SetFrame(fgSPDFrameBox);
166 SetPalette(fgSPDPalette);
168 symname += strLadder;
172 rest = fID - 8*nsector;
179 rest = id - 8*nsector;
182 if (rest < 4) nstave = 0;
187 fDx = fInfo->fSegSPD->Dx()*0.00005;
189 fDy = fInfo->fSegSPD->Dy()*0.00005;
192 else if (fID <= fInfo->fGeom->GetLastSDD())
196 SetFrame(fgSDDFrameBox);
197 SetPalette(fgSDDPalette);
199 symname += strSensor;
204 rest = id - 6*nladder;
210 rest = id - 8*nladder;
215 fDx = fInfo->fSegSDD->Dx()*0.0001;
216 fDz = fInfo->fSegSDD->Dz()*0.00005;
217 fDy = fInfo->fSegSDD->Dy()*0.00005;
224 SetFrame(fgSSDFrameBox);
225 SetPalette(fgSSDPalette);
227 symname += strSensor;
232 rest = id - nladder*22;
238 rest = id - nladder*25;
243 fInfo->fSegSSD->SetLayer(fLayer);
244 fDx = fInfo->fSegSSD->Dx()*0.00005;
245 fDz = fInfo->fSegSSD->Dz()*0.00005;
246 fDy = fInfo->fSegSSD->Dy()*0.00005;
256 void AliEveITSModule::LoadQuads()
258 // Here we still use 'z' for the name of axial coordinates.
259 // The transforamtion matrix aplied rotates y -> z.
260 // We need this as TEveQuadSet offers optimized treatment for
261 // quads in the x-y plane.
263 // printf("its module load quads \n");
265 TClonesArray *digits = fInfo->GetDigits(fID, fDetID);
266 Int_t ndigits = digits ? digits->GetEntriesFast() : 0;
268 Float_t x, z, dpx, dpz;
275 AliITSsegmentationSPD* seg = fInfo->fSegSPD;
277 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
279 for (Int_t k=0; k<ndigits; ++k)
281 AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
284 x = -0.5*seg->Dx() + i*seg->Dpx(0);
286 fInfo->GetSPDLocalZ(j, z);
287 dpx = seg->Dpx(i)*0.0001;
288 dpz = seg->Dpz(j)*0.0001;
290 AddQuad(x, z, dpx, dpz);
291 QuadValue(1); // In principle could have color based on number of neigbours
298 AliITSsegmentationSDD *seg = fInfo->fSegSDD;
300 Reset(kQT_RectangleXZFixedY, kFALSE, 32);
302 for (Int_t k=0; k<ndigits; ++k)
304 AliITSdigit* d = (AliITSdigit*) digits->UncheckedAt(k);
306 // if (d->GetSignal() > fgSDDThreshold)
310 seg->DetToLocal(i, j, x, z);
311 dpx = seg->Dpx(i)*0.0001;
312 dpz = seg->Dpz(j)*0.0001;
314 AddQuad(x-2*dpx, z - dpz*0.5, 4*dpx, dpz);
315 QuadValue(d->GetSignal());
323 AliITSsegmentationSSD* seg = fInfo->fSegSSD;
325 Reset(kQT_LineXZFixedY, kFALSE, 32);
327 Float_t ap, an; // positive/negative angles -> offsets
329 ap = TMath::Tan(ap) * fDz;
330 an = - TMath::Tan(an) * fDz;
332 for (Int_t k=0; k<ndigits; ++k)
334 AliITSdigit *d = (AliITSdigit*) digits->UncheckedAt(k);
335 // if(d->GetSignal() > fgSSDThreshold)
339 seg->DetToLocal(i,j,x,z);
341 Float_t a = ( d->GetCoord1() == 1) ? ap : an;
343 AddLine(x-a, -fDz, 2*a, 2*fDz);
344 QuadValue(d->GetSignal());
346 // printf("%3d -> %3d -> %8x\n", d->GetSignal(), ci, fQuads.back().color);
357 /******************************************************************************/
359 void AliEveITSModule::SetTrans()
361 // Set transformation matrix based on module id (use geometry to
362 // retrieve this information).
365 fHMTrans.UnitTrans();
367 // !!!! Here should use AliITSgeomTGeo ... but can i be sure
368 // the geometry has been loaded?
371 fInfo->fGeom->GetRotMatrix(fID, x);
372 fHMTrans.SetBaseVec(1, x[0], x[3], x[6]);
373 fHMTrans.SetBaseVec(2, x[1], x[4], x[7]);
374 fHMTrans.SetBaseVec(3, x[2], x[5], x[8]);
376 fInfo->fGeom->GetTrans(fID, x);
377 fHMTrans.SetBaseVec(4, x);
380 /******************************************************************************/
382 void AliEveITSModule::DigitSelected(Int_t idx)
384 // Override control-click from TEveQuadSet
386 DigitBase_t* qb = GetDigit(idx);
387 TObject* obj = qb->fId.GetObject();
388 AliITSdigit* d = dynamic_cast<AliITSdigit*>(obj);
389 printf("AliEveITSModule::QuadSelected "); Print();
390 printf(" idx=%d, value=%d, obj=0x%lx, digit=0x%lx\n",
391 idx, qb->fValue, (ULong_t)obj, (ULong_t)d);
393 printf(" coord1=%3d coord2=%3d signal=%d\n",
394 d->GetCoord1(), d->GetCoord2(), d->GetSignal());
398 /******************************************************************************/
400 void AliEveITSModule::Print(Option_t* ) const
402 printf("ID %d, layer %d, ladder %d, det %d \n", fID, fLayer, fLadder, fDetID);