1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Manages the digits and the track dictionary in the form of //
21 // AliTRDdataArray objects. //
23 ///////////////////////////////////////////////////////////////////////////////
25 #include <Riostream.h>
34 #include "AliTRDdigitsManager.h"
35 #include "AliTRDsegmentArray.h"
36 #include "AliTRDdataArrayI.h"
37 #include "AliTRDdigit.h"
38 #include "AliTRDgeometry.h"
40 #include "AliTRDSignalIndex.h"
42 ClassImp(AliTRDdigitsManager)
44 //_____________________________________________________________________________
46 // Number of track dictionary arrays
47 const Int_t AliTRDdigitsManager::fgkNDict = kNDict;
49 //_____________________________________________________________________________
50 AliTRDdigitsManager::AliTRDdigitsManager()
58 ,fUseDictionaries(kTRUE)
61 // Default constructor
64 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
65 fDictionary[iDict] = NULL;
68 //fSignalIndexes = new TList();
69 fSignalIndexes = new TObjArray(AliTRDgeometry::Ndet());
73 //_____________________________________________________________________________
74 AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m)
82 ,fUseDictionaries(kTRUE)
85 // AliTRDdigitsManager copy constructor
90 //_____________________________________________________________________________
91 AliTRDdigitsManager::~AliTRDdigitsManager()
94 // AliTRDdigitsManager destructor
103 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
104 fDictionary[iDict]->Delete();
105 delete fDictionary[iDict];
106 fDictionary[iDict] = NULL;
109 if (fSignalIndexes) {
110 fSignalIndexes->Delete();
111 delete fSignalIndexes;
113 fSignalIndexes = NULL;
117 //_____________________________________________________________________________
118 AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m)
121 // Assignment operator
124 if (this != &m) ((AliTRDdigitsManager &) m).Copy(*this);
129 //_____________________________________________________________________________
130 void AliTRDdigitsManager::Copy(TObject &m) const
136 ((AliTRDdigitsManager &) m).fIsRaw = fIsRaw;
137 ((AliTRDdigitsManager &) m).fEvent = fEvent;
138 ((AliTRDdigitsManager &) m).fSDigits = fSDigits;
140 ((AliTRDdigitsManager &) m).fSignalIndexes = fSignalIndexes;
141 ((AliTRDdigitsManager &) m).fUseDictionaries = fUseDictionaries;
147 //_____________________________________________________________________________
148 void AliTRDdigitsManager::CreateArrays()
151 // Create the data arrays
154 fDigits = new AliTRDsegmentArray("AliTRDdataArrayI",AliTRDgeometry::Ndet());
156 if (fUseDictionaries)
158 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
159 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
160 ,AliTRDgeometry::Ndet());
164 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++)
166 fSignalIndexes->AddLast(new AliTRDSignalIndex());
169 //_____________________________________________________________________________
170 void AliTRDdigitsManager::ResetArrays()
173 // Reset the data arrays
180 fDigits = new AliTRDsegmentArray("AliTRDdataArrayI",AliTRDgeometry::Ndet());
182 if (fUseDictionaries)
184 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
185 if (fDictionary[iDict]) {
186 fDictionary[iDict]->Delete();
187 delete fDictionary[iDict];
189 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
190 ,AliTRDgeometry::Ndet());
194 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++)
196 AliTRDSignalIndex *idx = (AliTRDSignalIndex *)fSignalIndexes->At(i);
197 if (idx) idx->Reset();
201 //_____________________________________________________________________________
202 void AliTRDdigitsManager::SetRaw()
205 // Switch on the raw digits flag
210 fDigits->SetBit(AliTRDdigit::RawDigit());
214 //_____________________________________________________________________________
215 Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time
219 // Returns the amplitude of a digit
222 if (!GetDigits(det)) return 0;
223 return ((Short_t) GetDigits(det)->GetData(row,col,time));
227 //_____________________________________________________________________________
228 Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree)
231 // Creates the tree and branches for the digits and the dictionary
234 Int_t buffersize = 64000;
236 Bool_t status = kTRUE;
242 // Make the branch for the digits
244 const AliTRDdataArray *kDigits = (AliTRDdataArray *) fDigits->At(0);
246 if (!fTree) return kFALSE;
247 TBranch* branch = fTree->GetBranch("TRDdigits");
248 if (!branch) fTree->Branch("TRDdigits",kDigits->IsA()->GetName(),
249 &kDigits,buffersize,99);
250 AliDebug(1,"Making branch TRDdigits\n");
260 if (fUseDictionaries)
262 // Make the branches for the dictionaries
263 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
264 Char_t branchname[15];
265 sprintf(branchname,"TRDdictionary%d",iDict);
266 if (fDictionary[iDict]) {
267 const AliTRDdataArray *kDictionary =
268 (AliTRDdataArray *) fDictionary[iDict]->At(0);
270 if (!fTree) return kFALSE;
271 TBranch* branch = fTree->GetBranch(branchname);
272 if (!branch) fTree->Branch(branchname,kDictionary->IsA()->GetName(),
273 &kDictionary,buffersize,99);
274 AliDebug(1,Form("Making branch %s\n",branchname));
290 //_____________________________________________________________________________
291 Bool_t AliTRDdigitsManager::ReadDigits(TTree *tree)
294 // Reads the digit information from the input file
297 Bool_t status = kTRUE;
306 AliDebug(1,"Create the data arrays.\n");
310 status = fDigits->LoadArray("TRDdigits",fTree);
312 if (fUseDictionaries)
314 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
315 Char_t branchname[15];
316 sprintf(branchname,"TRDdictionary%d",iDict);
317 status = fDictionary[iDict]->LoadArray(branchname,fTree);
318 if (status == kFALSE)
320 fUseDictionaries = kFALSE;
321 AliWarning("Unable to load dict arrays. Will not use them.\n");
327 if (fDigits->TestBit(AliTRDdigit::RawDigit())) {
338 //_____________________________________________________________________________
339 Bool_t AliTRDdigitsManager::WriteDigits()
342 // Writes out the TRD-digits and the dictionaries
345 // Store the contents of the segment array in the tree
346 if (!fDigits->StoreArray("TRDdigits",fTree)) {
347 AliError("Error while storing digits in branch TRDdigits\n");
351 if (fUseDictionaries)
353 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
354 Char_t branchname[15];
355 sprintf(branchname,"TRDdictionary%d",iDict);
356 if (!fDictionary[iDict]->StoreArray(branchname,fTree)) {
357 AliError(Form("Error while storing dictionary in branch %s\n",branchname));
363 // Write the new tree to the output file
364 fTree->AutoSave(); // Modification by Jiri
370 //_____________________________________________________________________________
371 AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row, Int_t col
372 , Int_t time, Int_t det) const
375 // Creates a single digit object
386 amp[0] = GetDigits(det)->GetData(row,col,time);
388 return (new AliTRDdigit(fIsRaw,digits,amp));
392 //_____________________________________________________________________________
393 Int_t AliTRDdigitsManager::GetTrack(Int_t track
394 , Int_t row, Int_t col, Int_t time
398 // Returns the MC-track numbers from the dictionary.
401 if ((track < 0) || (track >= kNDict)) {
402 AliError(Form("track %d out of bounds (size: %d, this: 0x%08x)"
403 ,track,kNDict,this));
407 if (fUseDictionaries == kFALSE)
411 // Array contains index+1 to allow data compression
412 return (GetDictionary(det,track)->GetData(row,col,time) - 1);
416 //_____________________________________________________________________________
417 AliTRDdataArrayI *AliTRDdigitsManager::GetDigits(Int_t det) const
420 // Returns the digits array for one detector
423 if (!fDigits) return 0x0;
424 return (AliTRDdataArrayI *) fDigits->At(det);
428 //_____________________________________________________________________________
429 AliTRDdataArrayI *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const
432 // Returns the dictionary for one detector
434 if (fUseDictionaries == kFALSE)
439 return (AliTRDdataArrayI *) fDictionary[i]->At(det);
443 //_____________________________________________________________________________
444 Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit *Digit) const
447 // Returns the MC-track numbers from the dictionary for a given digit
450 Int_t row = Digit->GetRow();
451 Int_t col = Digit->GetCol();
452 Int_t time = Digit->GetTime();
453 Int_t det = Digit->GetDetector();
455 return GetTrack(track,row,col,time,det);
459 //_____________________________________________________________________________
460 AliTRDSignalIndex *AliTRDdigitsManager::GetIndexes(Int_t det)
463 // Returns indexes of active pads
466 return (AliTRDSignalIndex*)fSignalIndexes->At(det);
470 //_____________________________________________________________________________
471 void AliTRDdigitsManager::RemoveDigits(Int_t det)
477 fDigits->ClearSegment(det);
481 //_____________________________________________________________________________
482 void AliTRDdigitsManager::RemoveDictionaries(Int_t det)
487 if (fUseDictionaries == kFALSE)
492 for (Int_t i = 0; i < kNDict; i++) {
493 fDictionary[i]->ClearSegment(det);
498 //_____________________________________________________________________________
499 void AliTRDdigitsManager::ClearIndexes(Int_t det)
504 fSignalIndexes->At(det)->Clear();
508 //_____________________________________________________________________________
509 Bool_t AliTRDdigitsManager::BuildIndexes(Int_t det)
512 // Build the list of indices
520 AliTRDdataArrayI *digits = GetDigits(det);
521 //digits should be expanded by now!!!
522 if (digits->GetNtime() > 0)
525 nRows = digits->GetNrow();
526 nCols = digits->GetNcol();
527 nTbins = digits->GetNtime();
529 //AliInfo(Form("rows %d cols %d tbins %d", nRows, nCols, nTbins));
531 AliTRDSignalIndex* indexes = GetIndexes(det);
532 indexes->SetSM(geom.GetSector(det));
533 indexes->SetChamber(geom.GetChamber(det));
534 indexes->SetPlane(geom.GetPlane(det));
535 indexes->SetDetNumber(det);
536 if (indexes->IsAllocated() == kFALSE)
538 indexes->Allocate(nRows, nCols, nTbins);
539 //AliInfo(Form("Allocating 0x%x %d", indexes->GetArray(), indexes->GetArray()->GetSize()));
541 for (Int_t ir = 0; ir < nRows; ir++)
543 for (Int_t ic = 0; ic < nCols; ic++)
545 for (Int_t it = 0; it < nTbins; it++)
547 //AliInfo(Form("row %d col %d tbin %d", ir, ic, it));
549 Int_t isig = digits->GetDataUnchecked(ir, ic, it);
552 //AliInfo(Form("row %d col %d tbin %d", ir, ic, it));
553 indexes->AddIndexTBin(ir, ic, it);