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 "AliEveITSDigitsInfo.h"
11 #include <EveBase/AliEveEventManager.h>
13 #include <TEveTreeTools.h>
14 #include <TEveTrans.h>
17 #include <AliITSInitGeometry.h>
18 #include <AliITSgeomTGeo.h>
19 #include <AliITSsegmentationSPD.h>
20 #include <AliITSsegmentationSDD.h>
21 #include <AliITSsegmentationSSD.h>
22 #include <AliITSDDLModuleMapSDD.h>
24 #include <AliITSCalibrationSDD.h>
25 #include <AliITSdigit.h>
26 #include <AliITSdigitSPD.h>
28 #include <AliCDBEntry.h>
29 #include <AliCDBManager.h>
31 #include <AliRawReader.h>
32 #include <AliITSRawStreamSPD.h>
33 #include <AliITSRawStreamSDD.h>
34 #include <AliITSRawStreamSSD.h>
36 #include <TGeoMatrix.h>
40 //______________________________________________________________________________
42 // Helper for selecting a range of ITS modules by type, layer, phi and
43 // theta. Taken as an argument to AliEveITSDigitsInfo::GetModuleIDs().
45 ClassImp(AliEveITSModuleSelection)
47 AliEveITSModuleSelection::AliEveITSModuleSelection():
50 fMinPhi(-TMath::Pi()),
52 fMinTheta(-TMath::Pi()),
53 fMaxTheta(TMath::Pi())
59 //______________________________________________________________________________
61 // Stores ITS geometry information and event-data in format suitable
64 ClassImp(AliEveITSDigitsInfo)
66 /******************************************************************************/
68 AliEveITSDigitsInfo::AliEveITSDigitsInfo() :
71 fSPDmap(), fSDDmap(), fSSDmap(),
73 fSegSPD (0), fSegSDD (0), fSegSSD (0),
75 fSPDMinVal (0), fSSDMinVal (0), fSDDMinVal (0),
76 fSPDMaxVal (0), fSSDMaxVal (0), fSDDMaxVal (0),
77 fSPDHighLim (0), fSDDHighLim (0), fSSDHighLim (0)
79 // Default constructor.
84 void AliEveITSDigitsInfo::InitInternals()
86 // Initialize internal geometry structures, in particular the
87 // module-id to transformation-matrix mapping and segmentation
88 // classes and data-structures.
90 static const TEveException eH("AliEveITSDigitsInfo::InitInternals ");
92 AliEveEventManager::AssertGeometry();
96 // create tables for scaling
109 // lowest scale factor refers to unscaled ITS module
116 // spd lowest resolution
117 Int_t nx = 8; // fSegSPD->Npx()/8; // 32
118 Int_t nz = 6; // fSegSPD->Npz()/2; // 128
119 fSPDScaleX[1] = Int_t(nx);
120 fSPDScaleZ[1] = Int_t(nz);
121 fSPDScaleX[2] = Int_t(nx*2);
122 fSPDScaleZ[2] = Int_t(nz*2);
123 fSPDScaleX[3] = Int_t(nx*3);
124 fSPDScaleZ[3] = Int_t(nz*3);
125 fSPDScaleX[4] = Int_t(nx*4);
126 fSPDScaleZ[4] = Int_t(nz*4);
142 fDDLMapSDD = new AliITSDDLModuleMapSDD();
143 AliCDBManager *man = AliCDBManager::Instance();
144 AliCDBEntry *ddlMapSDD = man->Get("ITS/Calib/DDLMapSDD");
145 ddlMapSDD->SetOwner(kTRUE);
147 AliWarning("SDD DDL map file retrieval from OCDB failed! - Use default DDL map");
149 AliITSDDLModuleMapSDD *ddlsdd = (AliITSDDLModuleMapSDD*)ddlMapSDD->GetObject();
151 AliWarning("SDD DDL map object not found in OCDB file! - Use default DDL map");
153 fDDLMapSDD->SetDDLMap(ddlsdd);
159 /******************************************************************************/
161 AliEveITSDigitsInfo:: ~AliEveITSDigitsInfo()
164 // Deletes the data-maps and the tree.
166 std::map<Int_t, TClonesArray*>::iterator j;
167 for (j = fSPDmap.begin(); j != fSPDmap.end(); ++j)
169 for (j = fSDDmap.begin(); j != fSDDmap.end(); ++j)
171 for (j = fSSDmap.begin(); j != fSSDmap.end(); ++j)
174 delete fSegSPD; delete fSegSDD; delete fSegSSD;
178 /******************************************************************************/
180 void AliEveITSDigitsInfo::SetTree(TTree* tree)
182 // Set digit-tree to be used for digit retrieval. Data is loaded on
188 void AliEveITSDigitsInfo::ReadRaw(AliRawReader* raw, Int_t mode)
190 // Read raw-data into internal structures. AliITSdigit is used to
191 // store raw-adata for all sub-detectors.
193 if ((mode & 1) || (mode & 2))
195 AliITSRawStreamSPD inputSPD(raw);
196 TClonesArray* digits = 0;
197 while (inputSPD.Next())
199 Int_t module = inputSPD.GetModuleID();
200 Int_t column = inputSPD.GetColumn();
201 Int_t row = inputSPD.GetRow();
203 if (inputSPD.IsNewModule())
205 digits = fSPDmap[module];
207 fSPDmap[module] = digits = new TClonesArray("AliITSdigit", 16);
210 AliITSdigit* d = new ((*digits)[digits->GetEntriesFast()]) AliITSdigit();
211 d->SetCoord1(column);
215 // printf("SPD: %d %d %d\n",module,column,row);
220 if ((mode & 4) || (mode & 8))
222 AliITSRawStreamSDD input(raw);
223 input.SetDDLModuleMap(fDDLMapSDD);
224 TClonesArray* digits = 0;
227 Int_t module = input.GetModuleID();
228 Int_t anode = input.GetAnode();
229 Int_t time = input.GetTime();
230 Int_t signal = input.GetSignal();
232 if (input.IsNewModule())
234 digits = fSDDmap[module];
236 fSDDmap[module] = digits = new TClonesArray("AliITSdigit", 0);
239 AliITSdigit* d = new ((*digits)[digits->GetEntriesFast()]) AliITSdigit();
242 d->SetSignal(signal);
244 // printf("SDD: %d %d %d %d\n",module,anode,time,signal);
249 if ((mode & 16) || (mode & 32))
251 AliITSRawStreamSSD input(raw);
252 TClonesArray* digits = 0;
255 Int_t module = input.GetModuleID();
256 Int_t side = input.GetSideFlag();
257 Int_t strip = input.GetStrip();
258 Int_t signal = input.GetSignal();
260 // !!!! IsNewModule() is false in the beginning of the stream, so we also
261 // !!!! check for digits == 0. Should be fixed in SSD stream.
262 if (input.IsNewModule() || digits == 0)
264 digits = fSSDmap[module];
266 fSSDmap[module] = digits = new TClonesArray("AliITSdigit", 0);
269 AliITSdigit* d = new ((*digits)[digits->GetEntriesFast()]) AliITSdigit();
272 d->SetSignal(signal);
274 // printf("SSD: %d %d %d %d\n",module,side,strip,signal);
280 /******************************************************************************/
282 void AliEveITSDigitsInfo::SetITSSegmentation()
284 // Create the segmentation objects and fill internal
288 fSegSPD = new AliITSsegmentationSPD();
292 Float_t fZ1pitchSPD=0.0425; Float_t fZ2pitchSPD=0.0625;
295 fSPDZCoord[0]=fZ1pitchSPD -fHlSPD;
296 for (m=1; m<fNzSPD; m++) {
297 Double_t dz=fZ1pitchSPD;
298 if (m==31 || m==32 || m==63 || m==64 || m==95 || m==96 ||
299 m==127 || m==128) dz=fZ2pitchSPD;
300 fSPDZCoord[m]=fSPDZCoord[m-1]+dz;
303 for (m=0; m<fNzSPD; m++) {
304 Double_t dz=1.*fZ1pitchSPD;
305 if (m==31 || m==32 || m==63 || m==64 || m==95 || m==96 ||
306 m==127 || m==128) dz=1.*fZ2pitchSPD;
311 fSegSDD = new AliITSsegmentationSDD();
312 // !!!! Set default drift speed, eventually need to get it from CDB.
313 fSegSDD->SetDriftSpeed(7.3);
316 fSegSSD = new AliITSsegmentationSSD();
319 /******************************************************************************/
321 TClonesArray* AliEveITSDigitsInfo::GetDigits(Int_t mod, Int_t subdet)
323 // Return TClonesArray of digits for specified module and sub-detector-id.
329 TClonesArray* digitsSPD = 0;
330 std::map<Int_t, TClonesArray*>::iterator i = fSPDmap.find(mod);
331 if (i == fSPDmap.end()) {
333 TBranch* br = fTree->GetBranch("ITSDigitsSPD");
334 br->SetAddress(&digitsSPD);
336 fSPDmap[mod] = digitsSPD;
348 TClonesArray* digitsSDD = 0;
349 std::map<Int_t, TClonesArray*>::iterator i = fSDDmap.find(mod);
350 if (i == fSDDmap.end()) {
352 TBranch* br = fTree->GetBranch("ITSDigitsSDD");
353 br->SetAddress(&digitsSDD);
355 fSDDmap[mod] = digitsSDD;
367 TClonesArray* digitsSSD = 0;
368 std::map<Int_t, TClonesArray*>::iterator i = fSSDmap.find(mod);
369 if (i == fSSDmap.end()) {
371 TBranch* br = fTree->GetBranch("ITSDigitsSSD");
372 br->SetAddress(&digitsSSD);
375 fSSDmap[mod] = digitsSSD;
391 /******************************************************************************/
393 void AliEveITSDigitsInfo::GetModuleIDs(AliEveITSModuleSelection* sel,
394 std::vector<UInt_t>& ids)
396 // Fill the id-vector with ids of modules that satisfy conditions
397 // given by the AliEveITSModuleSelection object.
399 Int_t idx0 = 0, idx1 = 0;
400 switch(sel->GetType())
404 idx1 = AliITSgeomTGeo::GetModuleIndex(3, 1, 1) - 1;
407 idx0 = AliITSgeomTGeo::GetModuleIndex(3, 1, 1);
408 idx1 = AliITSgeomTGeo::GetModuleIndex(5, 1, 1) - 1;
411 idx0 = AliITSgeomTGeo::GetModuleIndex(5, 1, 1);
412 idx1 = AliITSgeomTGeo::GetNModules() - 1;
416 idx1 = AliITSgeomTGeo::GetNModules() - 1;
423 for (Int_t id = idx0; id < idx1; ++id)
425 AliITSgeomTGeo::GetModuleId(id, lay, lad, det);
426 if (sel->GetLayer() == lay || sel->GetLayer() == -1)
428 // check data from matrix
429 mx.SetFrom(*AliITSgeomTGeo::GetMatrix(id));
431 if (v.Phi() <= sel->GetMaxPhi() && v.Phi() >= sel->GetMinPhi() &&
432 v.Theta() <= sel->GetMaxTheta() && v.Theta() >= sel->GetMinTheta())
440 /******************************************************************************/
442 void AliEveITSDigitsInfo::Print(Option_t* ) const
444 // Print information about stored geometry and segmentation.
446 printf("*********************************************************\n");
447 printf("SPD module dimension (%f,%f)\n", fSegSPD->Dx()*0.0001, fSegSPD->Dz()*0.0001);
448 printf("SPD first,last module: %d, %d\n",
449 AliITSgeomTGeo::GetModuleIndex(1,1,1),
450 AliITSgeomTGeo::GetModuleIndex(3,1,1) - 1);
451 printf("SPD num cells per module (x::%d,z::%d)\n", fSegSPD->Npx(), fSegSPD->Npz());
452 Int_t iz = 0, ix = 0;
453 printf("SPD dimesion of (%d,%d) in pixel(%f,%f)\n", ix, iz, fSegSPD->Dpx(ix), fSegSPD->Dpz(iz));
455 printf("SPD dimesion of pixel (%d,%d) are (%f,%f)\n", ix, iz, fSegSPD->Dpx(ix)*0.001, fSegSPD->Dpz(iz)*0.001);
457 printf("*********************************************************\n");
458 printf("SDD module dimension (%f,%f)\n", fSegSDD->Dx()*0.0001, fSegSDD->Dz()*0.0001);
459 printf("SDD first,last module: %d, %d\n",
460 AliITSgeomTGeo::GetModuleIndex(3,1,1),
461 AliITSgeomTGeo::GetModuleIndex(5,1,1) - 1);
462 printf("SDD num cells per module (x::%d,z::%d)\n", fSegSDD->Npx(), fSegSDD->Npz());
463 printf("SDD dimesion of pixel are (%f,%f)\n", fSegSDD->Dpx(1)*0.001, fSegSDD->Dpz(1)*0.001);
466 printf("*********************************************************\n");
467 printf("SSD module dimension (%f,%f)\n", fSegSSD->Dx()*0.0001, fSegSSD->Dz()*0.0001);
468 printf("SSD first, last module: %d, %d\n",
469 AliITSgeomTGeo::GetModuleIndex(5,1,1),
470 AliITSgeomTGeo::GetNModules() - 1);
471 printf("SSD strips in module %d\n", fSegSSD->Npx());
472 printf("SSD strip sizes are (%f,%f)\n", fSegSSD->Dpx(1), fSegSSD->Dpz(1));
473 fSegSSD->SetLayer(5); fSegSSD->Angles(ap,an);
474 printf("SSD layer 5 stereoP %f stereoN %f angle\n", ap, an);
475 fSegSSD->SetLayer(6); fSegSSD->Angles(ap,an);
476 printf("SSD layer 6 stereoP %f stereoN %f angle\n", ap, an);
481 printf("num cells %d,%d scaled %d,%d \n",fSegSPD->Npz(),fSegSPD->Npx(),Nz,Nx);
482 printf("%d digits in AliEveITSModule %d\n",ne, module);
483 Float_t zn = i*(3.48*2)/Nz - 3.48 ;
484 Float_t xo = -fSegSPD->Dx()*0.00005 + fSegSPD->Dpx(0)*od->GetCoord2()*0.0001;
485 Float_t xn = -fSegSPD->Dx()*0.00005 + j*0.0001*fSegSPD->Dx()/Nx;
486 Float_t dpx = 0.0001*fSegSPD->Dx()/Nx;
487 Float_t dpz = 3.48*2/Nz;
488 printf("Z::original (%3f) scaled (%3f, %3f) \n", zo, zn-dpz/2, zn+dpz/2);
489 printf("X::original (%3f) scaled (%3f, %3f) \n", xo, xn-dpx/2, xn+dpx/2);
490 printf("%d,%d maped to %d,%d \n", od->GetCoord1(), od->GetCoord2(), i,j );