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>
14 #include <AliITSInitGeometry.h>
15 #include <AliITSgeomTGeo.h>
16 #include <AliITSsegmentationSPD.h>
17 #include <AliITSsegmentationSDD.h>
18 #include <AliITSsegmentationSSD.h>
19 #include <AliITSDDLModuleMapSDD.h>
21 #include <AliITSCalibrationSDD.h>
22 #include <AliITSCalibrationSPD.h>
23 #include <AliITSdigit.h>
24 #include <AliITSdigitSPD.h>
26 #include <AliCDBEntry.h>
27 #include <AliCDBManager.h>
29 #include <AliRawReader.h>
30 #include <AliITSRawStreamSPD.h>
31 #include <AliITSRawStreamSDD.h>
32 #include <AliITSRawStreamSDDCompressed.h>
33 #include <AliITSRawStreamSSD.h>
35 #include <TGeoMatrix.h>
36 #include <TEveTrans.h>
41 //==============================================================================
42 //==============================================================================
43 // AliEveITSModuleSelection
44 //==============================================================================
46 //______________________________________________________________________________
48 // Helper for selecting a range of ITS modules by type, layer, phi and
49 // theta. Taken as an argument to AliEveITSDigitsInfo::GetModuleIDs().
51 ClassImp(AliEveITSModuleSelection)
53 AliEveITSModuleSelection::AliEveITSModuleSelection():
56 fMinPhi(-TMath::Pi()),
58 fMinTheta(-TMath::Pi()),
59 fMaxTheta(TMath::Pi())
65 //==============================================================================
66 //==============================================================================
67 // AliEveITSDigitsInfo
68 //==============================================================================
70 //______________________________________________________________________________
72 // Stores ITS geometry information and event-data in format suitable
75 ClassImp(AliEveITSDigitsInfo)
77 AliITSDDLModuleMapSDD *AliEveITSDigitsInfo::fgDDLMapSDD = 0;
78 TObjArray *AliEveITSDigitsInfo::fgDeadModSPD = 0;
80 /******************************************************************************/
82 AliEveITSDigitsInfo::AliEveITSDigitsInfo() :
86 fSegSPD (0), fSegSDD (0), fSegSSD (0),
87 fSPDMinVal (0), fSSDMinVal (0), fSDDMinVal (0),
88 fSPDMaxVal (0), fSSDMaxVal (0), fSDDMaxVal (0),
89 fSPDHighLim (0), fSDDHighLim (0), fSSDHighLim (0),
90 fSPDmap (), fSDDmap (), fSSDmap ()
92 // Default constructor.
97 void AliEveITSDigitsInfo::InitInternals()
99 // Initialize internal geometry structures, in particular the
100 // module-id to transformation-matrix mapping and segmentation
101 // classes and data-structures.
103 static const TEveException kEH("AliEveITSDigitsInfo::InitInternals ");
105 AliEveEventManager::AssertGeometry();
107 SetITSSegmentation();
109 // create tables for scaling
122 // lowest scale factor refers to unscaled ITS module
129 // spd lowest resolution
130 Int_t nx = 8; // fSegSPD->Npx()/8; // 32
131 Int_t nz = 6; // fSegSPD->Npz()/2; // 128
132 fSPDScaleX[1] = Int_t(nx);
133 fSPDScaleZ[1] = Int_t(nz);
134 fSPDScaleX[2] = Int_t(nx*2);
135 fSPDScaleZ[2] = Int_t(nz*2);
136 fSPDScaleX[3] = Int_t(nx*3);
137 fSPDScaleZ[3] = Int_t(nz*3);
138 fSPDScaleX[4] = Int_t(nx*4);
139 fSPDScaleZ[4] = Int_t(nz*4);
155 if (fgDDLMapSDD == 0)
157 fgDDLMapSDD = new AliITSDDLModuleMapSDD();
158 AliCDBManager *man = AliCDBManager::Instance();
159 Bool_t cacheStatus = man->GetCacheFlag();
160 AliCDBEntry *ddlMapSDD = man->Get("ITS/Calib/DDLMapSDD");
164 AliWarning("SDD DDL map file retrieval from OCDB failed! - Use default DDL map");
168 AliITSDDLModuleMapSDD *ddlsdd = (AliITSDDLModuleMapSDD*)ddlMapSDD->GetObject();
171 AliWarning("SDD DDL map object not found in OCDB file! - Use default DDL map");
176 ddlMapSDD->SetObject(0);
177 ddlMapSDD->SetOwner(kTRUE);
178 fgDDLMapSDD->SetDDLMap(ddlsdd);
186 if (fgDeadModSPD == 0)
188 AliCDBManager *cdb = AliCDBManager::Instance();
190 AliCDBEntry *deadSPD = cdb->Get("ITS/Calib/SPDDead");
194 AliWarning("SPD Calibration object retrieval failed!");
198 fgDeadModSPD = (TObjArray*)deadSPD->GetObject();
199 fgDeadModSPD->SetOwner(kTRUE);
204 /******************************************************************************/
206 AliEveITSDigitsInfo::~AliEveITSDigitsInfo()
209 // Deletes the data-maps.
210 // The tree, if it was passed into the object, is not touched.
212 std::map<Int_t, TClonesArray*>::iterator j;
213 for (j = fSPDmap.begin(); j != fSPDmap.end(); ++j)
215 for (j = fSDDmap.begin(); j != fSDDmap.end(); ++j)
217 for (j = fSSDmap.begin(); j != fSSDmap.end(); ++j)
220 delete fSegSPD; delete fSegSDD; delete fSegSSD;
223 /******************************************************************************/
225 void AliEveITSDigitsInfo::SetTree(TTree* tree)
227 // Set digit-tree to be used for digit retrieval. Data is loaded on
233 void AliEveITSDigitsInfo::ReadRaw(AliRawReader* raw, Int_t mode)
235 // Read raw-data into internal structures. AliITSdigit is used to
236 // store raw-adata for all sub-detectors.
238 if ((mode & 1) || (mode & 2))
240 AliITSRawStreamSPD inputSPD(raw);
241 TClonesArray* digits = 0;
242 while (inputSPD.Next())
244 Int_t module = inputSPD.GetModuleID();
245 Int_t column = inputSPD.GetColumn();
246 Int_t row = inputSPD.GetRow();
248 if (inputSPD.IsNewModule())
250 digits = fSPDmap[module];
252 fSPDmap[module] = digits = new TClonesArray("AliITSdigit", 16);
255 AliITSdigit* d = new ((*digits)[digits->GetEntriesFast()]) AliITSdigit();
256 d->SetCoord1(column);
260 // printf("SPD: %d %d %d\n",module,column,row);
265 if ((mode & 4) || (mode & 8))
267 AliITSRawStream* inputSDD = AliITSRawStreamSDD::CreateRawStreamSDD(raw);
268 inputSDD->SetDDLModuleMap(fgDDLMapSDD);
269 TClonesArray* digits = 0;
270 while (inputSDD->Next())
272 Int_t module = inputSDD->GetModuleID();
274 digits = fSDDmap[module];
276 fSDDmap[module] = digits = new TClonesArray("AliITSdigit", 0);
278 if (inputSDD->IsCompletedModule()==kFALSE && inputSDD->IsCompletedDDL()==kFALSE)
280 Int_t anode = inputSDD->GetCoord1()+inputSDD->GetChannel()*AliITSsegmentationSDD::GetNAnodesPerHybrid();
281 Int_t time = inputSDD->GetCoord2();
282 Int_t signal = inputSDD->GetSignal();
283 AliITSdigit* d = new ((*digits)[digits->GetEntriesFast()]) AliITSdigit();
286 d->SetSignal(signal);
288 // printf("SDD: %d %d %d %d\n",module,anode,time,signal);
294 if ((mode & 16) || (mode & 32))
296 AliITSRawStreamSSD input(raw);
297 TClonesArray* digits = 0;
300 Int_t module = input.GetModuleID();
301 Int_t side = input.GetSideFlag();
302 Int_t strip = input.GetStrip();
303 Int_t signal = input.GetSignal();
305 // !!!! IsNewModule() is false in the beginning of the stream, so we also
306 // !!!! check for digits == 0. Should be fixed in SSD stream.
307 if (input.IsNewModule() || digits == 0)
309 digits = fSSDmap[module];
311 fSSDmap[module] = digits = new TClonesArray("AliITSdigit", 0);
314 AliITSdigit* d = new ((*digits)[digits->GetEntriesFast()]) AliITSdigit();
317 d->SetSignal(signal);
319 // printf("SSD: %d %d %d %d\n",module,side,strip,signal);
325 /******************************************************************************/
327 void AliEveITSDigitsInfo::SetITSSegmentation()
329 // Create the segmentation objects and fill internal
333 fSegSPD = new AliITSsegmentationSPD("TGeo");
335 Float_t fNzSPD = 160;
336 Float_t fHlSPD = 3.48;
337 Float_t fZ1pitchSPD = 0.0425, fZ2pitchSPD = 0.0625;
339 fSPDZCoord[0] = fZ1pitchSPD - fHlSPD;
340 for (Int_t m=1; m<fNzSPD; m++)
342 Float_t dz = fZ1pitchSPD;
343 if (m==31 || m==32 || m==63 || m==64 || m==95 || m==96 || m==127 || m==128)
347 fSPDZCoord[m] = fSPDZCoord[m-1] + dz;
350 for (Int_t m=0; m<fNzSPD; m++)
352 Float_t dz = fZ1pitchSPD;
353 if (m==31 || m==32 || m==63 || m==64 || m==95 || m==96 || m==127 || m==128)
361 fSegSDD = new AliITSsegmentationSDD("TGeo");
362 // !!!! Set default drift speed, eventually need to get it from CDB.
363 fSegSDD->SetDriftSpeed(7.3);
366 fSegSSD = new AliITSsegmentationSSD("TGeo");
369 /******************************************************************************/
371 TClonesArray* AliEveITSDigitsInfo::GetDigits(Int_t mod, Int_t subdet) const
373 // Return TClonesArray of digits for specified module and sub-detector-id.
379 std::map<Int_t, TClonesArray*>::iterator i = fSPDmap.find(mod);
380 if (i != fSPDmap.end())
386 TClonesArray *digitsSPD = 0;
387 TBranch *br = fTree->GetBranch("ITSDigitsSPD");
388 br->SetAddress(&digitsSPD);
390 fSPDmap[mod] = digitsSPD;
398 std::map<Int_t, TClonesArray*>::iterator i = fSDDmap.find(mod);
399 if (i != fSDDmap.end())
405 TClonesArray *digitsSDD = 0;
406 TBranch *br = fTree->GetBranch("ITSDigitsSDD");
407 br->SetAddress(&digitsSDD);
409 fSDDmap[mod] = digitsSDD;
417 std::map<Int_t, TClonesArray*>::iterator i = fSSDmap.find(mod);
418 if (i != fSSDmap.end())
424 TClonesArray *digitsSSD = 0;
425 TBranch *br = fTree->GetBranch("ITSDigitsSSD");
426 br->SetAddress(&digitsSSD);
428 fSSDmap[mod] = digitsSSD;
438 /******************************************************************************/
440 void AliEveITSDigitsInfo::GetModuleIDs(AliEveITSModuleSelection* sel,
441 std::vector<UInt_t>& ids) const
443 // Fill the id-vector with ids of modules that satisfy conditions
444 // given by the AliEveITSModuleSelection object.
446 Int_t idx0 = 0, idx1 = 0;
447 switch(sel->GetType())
451 idx1 = AliITSgeomTGeo::GetModuleIndex(3, 1, 1) - 1;
454 idx0 = AliITSgeomTGeo::GetModuleIndex(3, 1, 1);
455 idx1 = AliITSgeomTGeo::GetModuleIndex(5, 1, 1) - 1;
458 idx0 = AliITSgeomTGeo::GetModuleIndex(5, 1, 1);
459 idx1 = AliITSgeomTGeo::GetNModules() - 1;
463 idx1 = AliITSgeomTGeo::GetNModules() - 1;
470 for (Int_t id = idx0; id < idx1; ++id)
472 AliITSgeomTGeo::GetModuleId(id, lay, lad, det);
473 if (sel->GetLayer() == lay || sel->GetLayer() == -1)
475 // check data from matrix
476 mx.SetFrom(*AliITSgeomTGeo::GetMatrix(id));
478 if (v.Phi() <= sel->GetMaxPhi() && v.Phi() >= sel->GetMinPhi() &&
479 v.Theta() <= sel->GetMaxTheta() && v.Theta() >= sel->GetMinTheta())
487 /******************************************************************************/
489 Bool_t AliEveITSDigitsInfo::HasData(Int_t module, Int_t det_id) const
491 // Return true if given module has data.
493 TClonesArray *digits = GetDigits(module, det_id);
494 return digits && digits->GetEntriesFast() > 0;
497 Bool_t AliEveITSDigitsInfo::IsDead (Int_t module, Int_t det_id) const
499 // Return true if given module is dead.
500 // Only implemented for SPD.
502 if (det_id == 0 && fgDeadModSPD)
503 return ((AliITSCalibrationSPD*) fgDeadModSPD->At(module))->IsBad();
507 /******************************************************************************/
509 void AliEveITSDigitsInfo::Print(Option_t* ) const
511 // Print information about stored geometry and segmentation.
513 printf("*********************************************************\n");
514 printf("SPD module dimension (%f,%f)\n", fSegSPD->Dx()*0.0001, fSegSPD->Dz()*0.0001);
515 printf("SPD first,last module: %d, %d\n",
516 AliITSgeomTGeo::GetModuleIndex(1,1,1),
517 AliITSgeomTGeo::GetModuleIndex(3,1,1) - 1);
518 printf("SPD num cells per module (x::%d,z::%d)\n", fSegSPD->Npx(), fSegSPD->Npz());
519 Int_t iz = 0, ix = 0;
520 printf("SPD dimesion of (%d,%d) in pixel(%f,%f)\n", ix, iz, fSegSPD->Dpx(ix), fSegSPD->Dpz(iz));
522 printf("SPD dimesion of pixel (%d,%d) are (%f,%f)\n", ix, iz, fSegSPD->Dpx(ix)*0.001, fSegSPD->Dpz(iz)*0.001);
524 printf("*********************************************************\n");
525 printf("SDD module dimension (%f,%f)\n", fSegSDD->Dx()*0.0001, fSegSDD->Dz()*0.0001);
526 printf("SDD first,last module: %d, %d\n",
527 AliITSgeomTGeo::GetModuleIndex(3,1,1),
528 AliITSgeomTGeo::GetModuleIndex(5,1,1) - 1);
529 printf("SDD num cells per module (x::%d,z::%d)\n", fSegSDD->Npx(), fSegSDD->Npz());
530 printf("SDD dimesion of pixel are (%f,%f)\n", fSegSDD->Dpx(1)*0.001, fSegSDD->Dpz(1)*0.001);
533 printf("*********************************************************\n");
534 printf("SSD module dimension (%f,%f)\n", fSegSSD->Dx()*0.0001, fSegSSD->Dz()*0.0001);
535 printf("SSD first, last module: %d, %d\n",
536 AliITSgeomTGeo::GetModuleIndex(5,1,1),
537 AliITSgeomTGeo::GetNModules() - 1);
538 printf("SSD strips in module %d\n", fSegSSD->Npx());
539 printf("SSD strip sizes are (%f,%f)\n", fSegSSD->Dpx(1), fSegSSD->Dpz(1));
540 fSegSSD->SetLayer(5); fSegSSD->Angles(ap,an);
541 printf("SSD layer 5 stereoP %f stereoN %f angle\n", ap, an);
542 fSegSSD->SetLayer(6); fSegSSD->Angles(ap,an);
543 printf("SSD layer 6 stereoP %f stereoN %f angle\n", ap, an);
548 printf("num cells %d,%d scaled %d,%d \n",fSegSPD->Npz(),fSegSPD->Npx(),Nz,Nx);
549 printf("%d digits in AliEveITSModule %d\n",ne, module);
550 Float_t zn = i*(3.48*2)/Nz - 3.48 ;
551 Float_t xo = -fSegSPD->Dx()*0.00005 + fSegSPD->Dpx(0)*od->GetCoord2()*0.0001;
552 Float_t xn = -fSegSPD->Dx()*0.00005 + j*0.0001*fSegSPD->Dx()/Nx;
553 Float_t dpx = 0.0001*fSegSPD->Dx()/Nx;
554 Float_t dpz = 3.48*2/Nz;
555 printf("Z::original (%3f) scaled (%3f, %3f) \n", zo, zn-dpz/2, zn+dpz/2);
556 printf("X::original (%3f) scaled (%3f, %3f) \n", xo, xn-dpx/2, xn+dpx/2);
557 printf("%d,%d maped to %d,%d \n", od->GetCoord1(), od->GetCoord2(), i,j );