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 "AliTRDdigit.h"
40 #include "AliTRDgeometry.h"
42 #include "AliTRDSignalIndex.h"
44 ClassImp(AliTRDdigitsManager)
46 //_____________________________________________________________________________
48 // Number of track dictionary arrays
49 const Int_t AliTRDdigitsManager::fgkNDict = kNDict;
51 //_____________________________________________________________________________
52 AliTRDdigitsManager::AliTRDdigitsManager()
59 ,fUseDictionaries(kTRUE)
62 // Default constructor
65 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
66 fDictionary[iDict] = NULL;
69 fSignalIndexes = new TObjArray(AliTRDgeometry::Ndet());
73 //_____________________________________________________________________________
74 AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m)
79 ,fHasSDigits(m.fHasSDigits)
81 ,fUseDictionaries(kTRUE)
84 // AliTRDdigitsManager copy constructor
89 //_____________________________________________________________________________
90 AliTRDdigitsManager::~AliTRDdigitsManager()
93 // AliTRDdigitsManager destructor
102 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
103 fDictionary[iDict]->Delete();
104 delete fDictionary[iDict];
105 fDictionary[iDict] = NULL;
108 if (fSignalIndexes) {
109 fSignalIndexes->Delete();
110 delete fSignalIndexes;
111 fSignalIndexes = NULL;
116 //_____________________________________________________________________________
117 AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m)
120 // Assignment operator
124 ((AliTRDdigitsManager &) m).Copy(*this);
131 //_____________________________________________________________________________
132 void AliTRDdigitsManager::Copy(TObject &m) const
138 ((AliTRDdigitsManager &) m).fEvent = fEvent;
139 ((AliTRDdigitsManager &) m).fHasSDigits = fHasSDigits;
141 ((AliTRDdigitsManager &) m).fSignalIndexes = fSignalIndexes;
142 ((AliTRDdigitsManager &) m).fUseDictionaries = fUseDictionaries;
148 //_____________________________________________________________________________
149 void AliTRDdigitsManager::CreateArrays()
152 // Create the data arrays
156 fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet());
159 fDigits = new AliTRDsegmentArray("AliTRDdataArrayS",AliTRDgeometry::Ndet());
162 if (fUseDictionaries) {
163 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
164 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
165 ,AliTRDgeometry::Ndet());
169 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) {
170 fSignalIndexes->AddLast(new AliTRDSignalIndex());
175 //_____________________________________________________________________________
176 void AliTRDdigitsManager::ResetArrays()
179 // Reset the data arrays
187 fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet());
190 fDigits = new AliTRDsegmentArray("AliTRDdataArrayS",AliTRDgeometry::Ndet());
193 if (fUseDictionaries) {
194 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
195 if (fDictionary[iDict]) {
196 fDictionary[iDict]->Delete();
197 delete fDictionary[iDict];
199 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
200 ,AliTRDgeometry::Ndet());
204 for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) {
205 AliTRDSignalIndex *idx = (AliTRDSignalIndex *)fSignalIndexes->At(i);
206 if (idx) idx->Reset();
211 //_____________________________________________________________________________
212 Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time
216 // Returns the amplitude of a digit
219 if (!GetDigits(det)) {
223 return ((Short_t) ((AliTRDdataArrayS *) 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) {
261 // Make the branches for the dictionaries
262 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
263 Char_t branchname[15];
264 sprintf(branchname,"TRDdictionary%d",iDict);
265 if (fDictionary[iDict]) {
266 const AliTRDdataArray *kDictionary =
267 (AliTRDdataArray *) fDictionary[iDict]->At(0);
269 if (!fTree) return kFALSE;
270 TBranch* branch = fTree->GetBranch(branchname);
271 if (!branch) fTree->Branch(branchname,kDictionary->IsA()->GetName()
272 ,&kDictionary,buffersize,99);
273 AliDebug(1,Form("Making branch %s\n",branchname));
289 //_____________________________________________________________________________
290 Bool_t AliTRDdigitsManager::ReadDigits(TTree *tree)
293 // Reads the digit information from the input file
296 Bool_t status = kTRUE;
303 AliDebug(1,"Create the data arrays.\n");
307 status = fDigits->LoadArray("TRDdigits",fTree);
309 if (fUseDictionaries) {
310 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
311 Char_t branchname[15];
312 sprintf(branchname,"TRDdictionary%d",iDict);
313 status = fDictionary[iDict]->LoadArray(branchname,fTree);
314 if (status == kFALSE) {
315 fUseDictionaries = kFALSE;
316 AliWarning("Unable to load dict arrays. Will not use them.\n");
326 //_____________________________________________________________________________
327 Bool_t AliTRDdigitsManager::WriteDigits()
330 // Writes out the TRD-digits and the dictionaries
333 // Store the contents of the segment array in the tree
334 if (!fDigits->StoreArray("TRDdigits",fTree)) {
335 AliError("Error while storing digits in branch TRDdigits\n");
339 if (fUseDictionaries) {
340 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
341 Char_t branchname[15];
342 sprintf(branchname,"TRDdictionary%d",iDict);
343 if (!fDictionary[iDict]->StoreArray(branchname,fTree)) {
344 AliError(Form("Error while storing dictionary in branch %s\n",branchname));
350 // Write the new tree to the output file
351 fTree->AutoSave(); // Modification by Jiri
357 //_____________________________________________________________________________
358 AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row, Int_t col
359 , Int_t time, Int_t det) const
362 // Creates a single digit object
373 amp[0] = ((AliTRDdataArrayS *) GetDigits(det))->GetData(row,col,time);
375 return (new AliTRDdigit(digits,amp));
379 //_____________________________________________________________________________
380 Int_t AliTRDdigitsManager::GetTrack(Int_t track
381 , Int_t row, Int_t col, Int_t time
385 // Returns the MC-track numbers from the dictionary.
388 if ((track < 0) || (track >= kNDict)) {
389 AliError(Form("track %d out of bounds (size: %d, this: 0x%08x)"
390 ,track,kNDict,this));
394 if (fUseDictionaries == kFALSE) {
398 // Array contains index+1 to allow data compression
399 return (((AliTRDdataArrayI *) GetDictionary(det,track))->GetData(row,col,time) - 1);
403 //_____________________________________________________________________________
404 AliTRDdataArray *AliTRDdigitsManager::GetDigits(Int_t det) const
407 // Returns the digits array for one detector
414 return (AliTRDdataArray *) fDigits->At(det);
418 //_____________________________________________________________________________
419 AliTRDdataArray *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const
422 // Returns the dictionary for one detector
425 if (fUseDictionaries == kFALSE) {
429 return (AliTRDdataArray *) fDictionary[i]->At(det);
433 //_____________________________________________________________________________
434 Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit *Digit) const
437 // Returns the MC-track numbers from the dictionary for a given digit
440 Int_t row = Digit->GetRow();
441 Int_t col = Digit->GetCol();
442 Int_t time = Digit->GetTime();
443 Int_t det = Digit->GetDetector();
445 return GetTrack(track,row,col,time,det);
449 //_____________________________________________________________________________
450 AliTRDSignalIndex *AliTRDdigitsManager::GetIndexes(Int_t det)
453 // Returns indexes of active pads
456 return (AliTRDSignalIndex *) fSignalIndexes->At(det);
460 //_____________________________________________________________________________
461 void AliTRDdigitsManager::RemoveDigits(Int_t det)
467 fDigits->ClearSegment(det);
471 //_____________________________________________________________________________
472 void AliTRDdigitsManager::RemoveDictionaries(Int_t det)
478 if (fUseDictionaries == kFALSE) {
482 for (Int_t i = 0; i < kNDict; i++) {
483 fDictionary[i]->ClearSegment(det);
488 //_____________________________________________________________________________
489 void AliTRDdigitsManager::ClearIndexes(Int_t det)
495 fSignalIndexes->At(det)->Clear();
499 //_____________________________________________________________________________
500 Bool_t AliTRDdigitsManager::BuildIndexes(Int_t det)
503 // Build the list of indices
511 AliTRDdataArrayS *digits = 0x0;
517 digits = (AliTRDdataArrayS *) GetDigits(det);
520 //digits should be expanded by now!!!
521 if (digits->GetNtime() > 0) {
524 nRows = digits->GetNrow();
525 nCols = digits->GetNcol();
526 nTbins = digits->GetNtime();
528 AliTRDSignalIndex *indexes = GetIndexes(det);
529 indexes->SetSM(geom.GetSector(det));
530 indexes->SetChamber(geom.GetChamber(det));
531 indexes->SetPlane(geom.GetPlane(det));
532 indexes->SetDetNumber(det);
534 if (indexes->IsAllocated() == kFALSE) {
535 indexes->Allocate(nRows,nCols,nTbins);
538 for (Int_t ir = 0; ir < nRows; ir++) {
539 for (Int_t ic = 0; ic < nCols; ic++) {
540 for (Int_t it = 0; it < nTbins; it++) {
542 Int_t isig = digits->GetDataUnchecked(ir,ic,it);
544 indexes->AddIndexTBin(ir,ic,it);