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 "AliTRDdataArray.h"
37 #include "AliTRDdataArrayI.h"
38 #include "AliTRDdataArrayS.h"
39 #include "AliTRDdataArrayDigits.h"
40 #include "AliTRDdigit.h"
41 #include "AliTRDgeometry.h"
43 #include "AliTRDSignalIndex.h"
45 ClassImp(AliTRDdigitsManager)
47 //_____________________________________________________________________________
49 // Number of track dictionary arrays
50 const Int_t AliTRDdigitsManager::fgkNDict = kNDict;
52 //_____________________________________________________________________________
53 AliTRDdigitsManager::AliTRDdigitsManager()
60 ,fUseDictionaries(kTRUE)
63 // Default constructor
66 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
67 fDictionary[iDict] = NULL;
70 fSignalIndexes = new TObjArray(AliTRDgeometry::Ndet());
74 //_____________________________________________________________________________
75 AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m)
80 ,fHasSDigits(m.fHasSDigits)
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;
112 fSignalIndexes = NULL;
117 //_____________________________________________________________________________
118 AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m)
121 // Assignment operator
125 ((AliTRDdigitsManager &) m).Copy(*this);
132 //_____________________________________________________________________________
133 void AliTRDdigitsManager::Copy(TObject &m) const
139 ((AliTRDdigitsManager &) m).fEvent = fEvent;
140 ((AliTRDdigitsManager &) m).fHasSDigits = fHasSDigits;
142 ((AliTRDdigitsManager &) m).fSignalIndexes = fSignalIndexes;
143 ((AliTRDdigitsManager &) m).fUseDictionaries = fUseDictionaries;
149 //_____________________________________________________________________________
150 void AliTRDdigitsManager::CreateArrays()
153 // Create the data arrays
157 fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet());
160 fDigits = new AliTRDsegmentArray("AliTRDdataArrayDigits",AliTRDgeometry::Ndet());
163 if (fUseDictionaries) {
164 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
165 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
166 ,AliTRDgeometry::Ndet());
170 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) {
171 fSignalIndexes->AddLast(new AliTRDSignalIndex());
176 //_____________________________________________________________________________
177 void AliTRDdigitsManager::ResetArrays()
180 // Reset the data arrays
188 fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet());
191 fDigits = new AliTRDsegmentArray("AliTRDdataArrayS",AliTRDgeometry::Ndet());
194 if (fUseDictionaries) {
195 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
196 if (fDictionary[iDict]) {
197 fDictionary[iDict]->Delete();
198 delete fDictionary[iDict];
200 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
201 ,AliTRDgeometry::Ndet());
205 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) {
206 AliTRDSignalIndex *idx = (AliTRDSignalIndex *)fSignalIndexes->At(i);
207 if (idx) idx->Reset();
212 //_____________________________________________________________________________
213 Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time
217 // Returns the amplitude of a digit
220 if (!GetDigits(det)) {
224 return ((Short_t) ((AliTRDdataArrayDigits *) GetDigits(det))->GetData(row,col,time));
228 //_____________________________________________________________________________
229 UChar_t AliTRDdigitsManager::GetPadStatus(Int_t row, Int_t col, Int_t time
233 // Returns the pad status for the requested pad
236 if (!GetDigits(det)) {
240 return ((UChar_t) ((AliTRDdataArrayDigits *) GetDigits(det))->GetPadStatus(row,col,time));
244 //_____________________________________________________________________________
245 Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree)
248 // Creates the tree and branches for the digits and the dictionary
251 Int_t buffersize = 64000;
253 Bool_t status = kTRUE;
259 // Make the branch for the digits
261 const AliTRDdataArray *kDigits = (AliTRDdataArray *) fDigits->At(0);
263 if (!fTree) return kFALSE;
264 TBranch* branch = fTree->GetBranch("TRDdigits");
265 if (!branch) fTree->Branch("TRDdigits",kDigits->IsA()->GetName()
266 ,&kDigits,buffersize,99);
267 AliDebug(1,"Making branch TRDdigits\n");
277 if (fUseDictionaries) {
278 // Make the branches for the dictionaries
279 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
280 Char_t branchname[15];
281 sprintf(branchname,"TRDdictionary%d",iDict);
282 if (fDictionary[iDict]) {
283 const AliTRDdataArray *kDictionary =
284 (AliTRDdataArray *) fDictionary[iDict]->At(0);
286 if (!fTree) return kFALSE;
287 TBranch* branch = fTree->GetBranch(branchname);
288 if (!branch) fTree->Branch(branchname,kDictionary->IsA()->GetName()
289 ,&kDictionary,buffersize,99);
290 AliDebug(1,Form("Making branch %s\n",branchname));
306 //_____________________________________________________________________________
307 Bool_t AliTRDdigitsManager::ReadDigits(TTree *tree)
310 // Reads the digit information from the input file
313 Bool_t status = kTRUE;
320 AliDebug(1,"Create the data arrays.\n");
324 status = fDigits->LoadArray("TRDdigits",fTree);
326 if (fUseDictionaries) {
327 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
328 Char_t branchname[15];
329 sprintf(branchname,"TRDdictionary%d",iDict);
330 status = fDictionary[iDict]->LoadArray(branchname,fTree);
331 if (status == kFALSE) {
332 fUseDictionaries = kFALSE;
333 AliWarning("Unable to load dict arrays. Will not use them.\n");
343 //_____________________________________________________________________________
344 Bool_t AliTRDdigitsManager::WriteDigits()
347 // Writes out the TRD-digits and the dictionaries
350 // Store the contents of the segment array in the tree
351 if (!fDigits->StoreArray("TRDdigits",fTree)) {
352 AliError("Error while storing digits in branch TRDdigits\n");
356 if (fUseDictionaries) {
357 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
358 Char_t branchname[15];
359 sprintf(branchname,"TRDdictionary%d",iDict);
360 if (!fDictionary[iDict]->StoreArray(branchname,fTree)) {
361 AliError(Form("Error while storing dictionary in branch %s\n",branchname));
367 // Write the new tree to the output file
368 fTree->AutoSave(); // Modification by Jiri
374 //_____________________________________________________________________________
375 AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row, Int_t col
376 , Int_t time, Int_t det) const
379 // Creates a single digit object
390 amp[0] = ((AliTRDdataArrayDigits *) GetDigits(det))->GetData(row,col,time);
392 return (new AliTRDdigit(digits,amp));
396 //_____________________________________________________________________________
397 Int_t AliTRDdigitsManager::GetTrack(Int_t track
398 , Int_t row, Int_t col, Int_t time
402 // Returns the MC-track numbers from the dictionary.
405 if ((track < 0) || (track >= kNDict)) {
406 AliError(Form("track %d out of bounds (size: %d, this: 0x%08x)"
407 ,track,kNDict,this));
411 if (fUseDictionaries == kFALSE) {
415 // Array contains index+1 to allow data compression
416 return (((AliTRDdataArrayI *) GetDictionary(det,track))->GetData(row,col,time) - 1);
420 //_____________________________________________________________________________
421 AliTRDdataArrayDigits *AliTRDdigitsManager::GetDigits(Int_t det) const
424 // Returns the digits array for one detector
431 return (AliTRDdataArrayDigits *) fDigits->At(det);
435 //_____________________________________________________________________________
436 AliTRDdataArray *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const
439 // Returns the dictionary for one detector
442 if (fUseDictionaries == kFALSE) {
446 return (AliTRDdataArray *) fDictionary[i]->At(det);
450 //_____________________________________________________________________________
451 Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit *Digit) const
454 // Returns the MC-track numbers from the dictionary for a given digit
457 Int_t row = Digit->GetRow();
458 Int_t col = Digit->GetCol();
459 Int_t time = Digit->GetTime();
460 Int_t det = Digit->GetDetector();
462 return GetTrack(track,row,col,time,det);
466 //_____________________________________________________________________________
467 AliTRDSignalIndex *AliTRDdigitsManager::GetIndexes(Int_t det)
470 // Returns indexes of active pads
473 return (AliTRDSignalIndex *) fSignalIndexes->At(det);
477 //_____________________________________________________________________________
478 void AliTRDdigitsManager::RemoveDigits(Int_t det)
484 fDigits->ClearSegment(det);
488 //_____________________________________________________________________________
489 void AliTRDdigitsManager::RemoveDictionaries(Int_t det)
495 if (fUseDictionaries == kFALSE) {
499 for (Int_t i = 0; i < kNDict; i++) {
500 fDictionary[i]->ClearSegment(det);
505 //_____________________________________________________________________________
506 void AliTRDdigitsManager::ClearIndexes(Int_t det)
512 ((AliTRDSignalIndex *) fSignalIndexes->At(det))->ClearAll();
516 //_____________________________________________________________________________
517 Bool_t AliTRDdigitsManager::BuildIndexes(Int_t det)
520 // Build the list of indices
528 AliTRDdataArrayDigits *digits = 0x0;
534 digits = (AliTRDdataArrayDigits *) GetDigits(det);
537 //digits should be expanded by now!!!
538 if (digits->GetNtime() > 0) {
541 nRows = digits->GetNrow();
542 nCols = digits->GetNcol();
543 nTbins = digits->GetNtime();
545 AliTRDSignalIndex *indexes = GetIndexes(det);
546 indexes->SetSM(geom.GetSector(det));
547 indexes->SetStack(geom.GetStack(det));
548 indexes->SetLayer(geom.GetLayer(det));
549 indexes->SetDetNumber(det);
551 if (indexes->IsAllocated() == kFALSE) {
552 indexes->Allocate(nRows,nCols,nTbins);
555 for (Int_t ir = 0; ir < nRows; ir++) {
556 for (Int_t ic = 0; ic < nCols; ic++) {
557 for (Int_t it = 0; it < nTbins; it++) {
559 Int_t isig = digits->GetDataUnchecked(ir,ic,it);
561 indexes->AddIndexTBin(ir,ic,it);