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>
33 #include "AliTRDdigitsManager.h"
34 #include "AliTRDsegmentArray.h"
35 #include "AliTRDdataArrayI.h"
36 #include "AliTRDdigit.h"
37 #include "AliTRDgeometry.h"
39 ClassImp(AliTRDdigitsManager)
41 //_____________________________________________________________________________
43 // Number of track dictionary arrays
44 const Int_t AliTRDdigitsManager::fgkNDict = kNDict;
46 //_____________________________________________________________________________
47 AliTRDdigitsManager::AliTRDdigitsManager():TObject()
50 // Default constructor
60 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
61 fDictionary[iDict] = NULL;
66 //_____________________________________________________________________________
67 AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m)
71 // AliTRDdigitsManager copy constructor
74 ((AliTRDdigitsManager &) m).Copy(*this);
78 //_____________________________________________________________________________
79 AliTRDdigitsManager::~AliTRDdigitsManager()
82 // AliTRDdigitsManager destructor
91 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
92 fDictionary[iDict]->Delete();
93 delete fDictionary[iDict];
94 fDictionary[iDict] = NULL;
99 //_____________________________________________________________________________
100 void AliTRDdigitsManager::Copy(TObject &m) const
106 ((AliTRDdigitsManager &) m).fIsRaw = fIsRaw;
107 ((AliTRDdigitsManager &) m).fEvent = fEvent;
108 ((AliTRDdigitsManager &) m).fDebug = fDebug;
109 ((AliTRDdigitsManager &) m).fSDigits = fSDigits;
115 //_____________________________________________________________________________
116 void AliTRDdigitsManager::CreateArrays()
119 // Create the data arrays
122 fDigits = new AliTRDsegmentArray("AliTRDdataArrayI",AliTRDgeometry::Ndet());
124 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
125 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
126 ,AliTRDgeometry::Ndet());
130 //_____________________________________________________________________________
131 void AliTRDdigitsManager::ResetArrays()
134 // Reset the data arrays
140 fDigits = new AliTRDsegmentArray("AliTRDdataArrayI",AliTRDgeometry::Ndet());
142 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
143 if (fDictionary[iDict]) {
144 delete fDictionary[iDict];
146 fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI"
147 ,AliTRDgeometry::Ndet());
152 //_____________________________________________________________________________
153 void AliTRDdigitsManager::SetRaw()
156 // Switch on the raw digits flag
161 fDigits->SetBit(AliTRDdigit::RawDigit());
165 //_____________________________________________________________________________
166 Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time
170 // Returns the amplitude of a digit
173 if (!GetDigits(det)) return 0;
174 return ((Short_t) GetDigits(det)->GetData(row,col,time));
178 //_____________________________________________________________________________
179 Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree)
182 // Creates the tree and branches for the digits and the dictionary
185 Int_t buffersize = 64000;
187 Bool_t status = kTRUE;
193 // Make the branch for the digits
195 const AliTRDdataArray *kDigits = (AliTRDdataArray *) fDigits->At(0);
197 if (!fTree) return kFALSE;
198 TBranch* branch = fTree->GetBranch("TRDdigits");
199 if (!branch) fTree->Branch("TRDdigits",kDigits->IsA()->GetName(),
200 &kDigits,buffersize,99);
202 printf("<AliTRDdigitsManager::MakeBranch> ");
203 printf("Making branch TRDdigits\n");
214 // Make the branches for the dictionaries
215 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
216 Char_t branchname[15];
217 sprintf(branchname,"TRDdictionary%d",iDict);
218 if (fDictionary[iDict]) {
219 const AliTRDdataArray *kDictionary =
220 (AliTRDdataArray *) fDictionary[iDict]->At(0);
222 if (!fTree) return kFALSE;
223 TBranch* branch = fTree->GetBranch(branchname);
224 if (!branch) fTree->Branch(branchname,kDictionary->IsA()->GetName(),
225 &kDictionary,buffersize,99);
227 printf("<AliTRDdigitsManager::MakeBranch> ");
228 printf("Making branch %s\n",branchname);
244 //_____________________________________________________________________________
245 Bool_t AliTRDdigitsManager::ReadDigits(TTree *tree)
248 // Reads the digit information from the input file
251 Bool_t status = kTRUE;
261 printf("<AliTRDdigitsManager::ReadDigits> ");
262 printf("Create the data arrays.\n");
267 status = fDigits->LoadArray("TRDdigits",fTree);
269 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
270 Char_t branchname[15];
271 sprintf(branchname,"TRDdictionary%d",iDict);
272 status = fDictionary[iDict]->LoadArray(branchname,fTree);
275 if (fDigits->TestBit(AliTRDdigit::RawDigit())) {
286 //_____________________________________________________________________________
287 Bool_t AliTRDdigitsManager::WriteDigits()
290 // Writes out the TRD-digits and the dictionaries
293 // Store the contents of the segment array in the tree
294 if (!fDigits->StoreArray("TRDdigits",fTree)) {
295 printf("<AliTRDdigitsManager::WriteDigits> ");
296 printf("Error while storing digits in branch TRDdigits\n");
299 for (Int_t iDict = 0; iDict < kNDict; iDict++) {
300 Char_t branchname[15];
301 sprintf(branchname,"TRDdictionary%d",iDict);
302 if (!fDictionary[iDict]->StoreArray(branchname,fTree)) {
303 printf("<AliTRDdigitsManager::WriteDigits> ");
304 printf("Error while storing dictionary in branch %s\n",branchname);
309 // Write the new tree to the output file
311 fTree->AutoSave(); // Modification by Jiri
317 //_____________________________________________________________________________
318 AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row, Int_t col
319 , Int_t time, Int_t det) const
322 // Creates a single digit object
333 amp[0] = GetDigits(det)->GetData(row,col,time);
335 return (new AliTRDdigit(fIsRaw,digits,amp));
339 //_____________________________________________________________________________
340 Int_t AliTRDdigitsManager::GetTrack(Int_t track
341 , Int_t row, Int_t col, Int_t time
345 // Returns the MC-track numbers from the dictionary.
348 if ((track < 0) || (track >= kNDict)) {
349 TObject::Error("GetTracks"
350 ,"track %d out of bounds (size: %d, this: 0x%08x)"
355 // Array contains index+1 to allow data compression
356 return (GetDictionary(det,track)->GetData(row,col,time) - 1);
360 //_____________________________________________________________________________
361 AliTRDdataArrayI *AliTRDdigitsManager::GetDigits(Int_t det) const
364 // Returns the digits array for one detector
367 if (!fDigits) return 0x0;
368 return (AliTRDdataArrayI *) fDigits->At(det);
372 //_____________________________________________________________________________
373 AliTRDdataArrayI *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const
376 // Returns the dictionary for one detector
379 return (AliTRDdataArrayI *) fDictionary[i]->At(det);
383 //_____________________________________________________________________________
384 Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit *Digit) const
387 // Returns the MC-track numbers from the dictionary for a given digit
390 Int_t row = Digit->GetRow();
391 Int_t col = Digit->GetCol();
392 Int_t time = Digit->GetTime();
393 Int_t det = Digit->GetDetector();
395 return GetTrack(track,row,col,time,det);
399 //_____________________________________________________________________________
400 AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m)
403 // Assignment operator
406 if (this != &m) ((AliTRDdigitsManager &) m).Copy(*this);