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 // TObjArray objects //
23 ///////////////////////////////////////////////////////////////////////////////
29 #include "AliTRDdigitsManager.h"
30 #include "AliTRDarrayDictionary.h"
31 #include "AliTRDarrayADC.h"
32 #include "AliTRDarraySignal.h"
33 #include "AliTRDdigit.h"
34 #include "AliTRDdigitsParam.h"
35 #include "AliTRDSimParam.h"
36 #include "AliTRDgeometry.h"
37 #include "AliTRDSignalIndex.h"
39 ClassImp(AliTRDdigitsManager)
41 //_____________________________________________________________________________
43 // Number of track dictionary arrays
44 const Int_t AliTRDdigitsManager::fgkNDict = kNDict;
46 //_____________________________________________________________________________
47 AliTRDdigitsManager::AliTRDdigitsManager(Bool_t rawRec)
54 ,fUseDictionaries(kTRUE)
55 ,fDets(AliTRDgeometry::Ndet())
60 // Default constructor
69 for (Int_t iDict = 0; iDict < kNDict; iDict++)
76 //_____________________________________________________________________________
77 AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m)
82 ,fHasSDigits(m.fHasSDigits)
84 ,fUseDictionaries(kTRUE)
90 // AliTRDdigitsManager copy constructor
95 //_____________________________________________________________________________
96 AliTRDdigitsManager::~AliTRDdigitsManager()
99 // AliTRDdigitsManager destructor
110 for (Int_t iDict = 0; iDict < kNDict; iDict++)
114 fDict[iDict]->Delete();
122 fSignalIndexes->Delete();
123 delete fSignalIndexes;
124 fSignalIndexes = NULL;
135 //_____________________________________________________________________________
136 AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m)
139 // Assignment operator
144 ((AliTRDdigitsManager &) m).Copy(*this);
151 //_____________________________________________________________________________
152 void AliTRDdigitsManager::Copy(TObject &m) const
158 ((AliTRDdigitsManager &) m).fEvent = fEvent;
159 ((AliTRDdigitsManager &) m).fHasSDigits = fHasSDigits;
160 ((AliTRDdigitsManager &) m).fDigits = NULL;
161 for(Int_t i = 0; i < kNDict; i++)
163 ((AliTRDdigitsManager &) m).fDict[i] = NULL;
165 ((AliTRDdigitsManager &) m).fSignalIndexes = NULL;
166 ((AliTRDdigitsManager &) m).fUseDictionaries = fUseDictionaries;
167 ((AliTRDdigitsManager &) m).fDets = fDets;
168 ((AliTRDdigitsManager &) m).fRawRec = fRawRec;
169 ((AliTRDdigitsManager &) m).fDigitsParam = NULL;
175 //_____________________________________________________________________________
176 void AliTRDdigitsManager::CreateArrays()
179 // Create the data arrays
189 fDigits = new TObjArray(fDets);
190 for (Int_t index = 0; index < fDets; index++)
192 fDigits->AddAt(new AliTRDarraySignal(),index);
202 fDigits = new TObjArray(fDets);
203 for (Int_t index = 0; index < fDets; index++)
205 fDigits->AddAt(new AliTRDarrayADC(),index);
209 if (fUseDictionaries)
211 for (Int_t iDict = 0; iDict < kNDict; iDict++)
215 fDict[iDict]->Delete();
218 fDict[iDict] = new TObjArray(fDets);
219 for (Int_t index = 0; index < fDets; index++)
221 fDict[iDict]->AddAt(new AliTRDarrayDictionary(),index);
228 fSignalIndexes->Delete();
229 delete fSignalIndexes;
231 fSignalIndexes = new TObjArray(fDets);
232 for (Int_t i = 0; i < fDets; i++)
234 fSignalIndexes->AddLast(new AliTRDSignalIndex());
241 fDigitsParam = new AliTRDdigitsParam();
242 fDigitsParam->SetNTimeBins(AliTRDSimParam::Instance()->GetNTimeBins());
243 fDigitsParam->SetADCbaseline(AliTRDSimParam::Instance()->GetADCbaseline());
247 //_____________________________________________________________________________
248 void AliTRDdigitsManager::ResetArrays()
251 // Reset the data arrays
261 fDigits = new TObjArray(fDets);
262 for (Int_t index = 0; index < fDets; index++)
264 fDigits->AddAt(new AliTRDarraySignal(),index);
269 fDigits = new TObjArray(fDets);
270 for (Int_t index = 0; index < fDets; index++)
272 fDigits->AddAt(new AliTRDarrayADC(),index);
276 for (Int_t iDict = 0; iDict < kNDict; iDict++)
280 fDict[iDict]->Delete();
285 if (fUseDictionaries)
287 for (Int_t iDict = 0; iDict < kNDict; iDict++)
289 fDict[iDict] = new TObjArray(fDets);
290 for (Int_t index = 0; index < fDets; index++)
292 fDict[iDict]->AddAt(new AliTRDarrayDictionary(),index);
299 fSignalIndexes->Delete();
300 delete fSignalIndexes;
302 fSignalIndexes = new TObjArray(fDets);
303 for (Int_t i = 0; i < fDets; i++)
305 fSignalIndexes->AddLast(new AliTRDSignalIndex());
310 //_____________________________________________________________________________
311 void AliTRDdigitsManager::ResetArrays(Int_t det)
314 // Reset the data arrays
317 Int_t recoDet = fRawRec ? 0 : det;
319 RemoveDigits(recoDet);
320 RemoveDictionaries(recoDet);
321 RemoveIndexes(recoDet);
325 fDigits->AddAt(new AliTRDarraySignal(),recoDet);
329 fDigits->AddAt(new AliTRDarrayADC(),recoDet);
332 if (fUseDictionaries)
334 for (Int_t iDict = 0; iDict < kNDict; iDict++)
336 fDict[iDict]->AddAt(new AliTRDarrayDictionary(),recoDet);
340 fSignalIndexes->AddAt(new AliTRDSignalIndex(),recoDet);
344 //_____________________________________________________________________________
345 void AliTRDdigitsManager::ClearArrays(Int_t det)
348 // Reset the data arrays
351 Int_t recoDet = fRawRec ? 0 : det;
355 ((AliTRDarraySignal*)fDigits->At(recoDet))->Reset();
359 ((AliTRDarrayADC*)fDigits->At(recoDet))->ConditionalReset((AliTRDSignalIndex*)fSignalIndexes->At(recoDet));
362 if (fUseDictionaries)
364 for (Int_t iDict = 0; iDict < kNDict; iDict++)
366 ((AliTRDarrayDictionary*)fDict[iDict]->At(recoDet))->Reset();
370 ((AliTRDSignalIndex*)fSignalIndexes->At(recoDet))->ResetContent();
374 //_____________________________________________________________________________
375 Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time, Int_t det) const
378 // Returns the amplitude of a digit
381 if (!GetDigits(det)) return 0;
383 return ((Short_t) ((AliTRDarrayADC *) GetDigits(det))->GetDataBits(row,col,time));
387 //_____________________________________________________________________________
388 UChar_t AliTRDdigitsManager::GetPadStatus(Int_t row, Int_t col, Int_t time, Int_t det) const
391 // Returns the pad status for the requested pad
394 if (!GetDigits(det)) return 0;
396 return ((UChar_t) ((AliTRDarrayADC *) GetDigits(det))->GetPadStatus(row,col,time));
400 //_____________________________________________________________________________
401 Bool_t AliTRDdigitsManager::MakeBranch(TTree * const tree)
404 // Creates the tree and branches for the digits and the dictionary
407 Int_t buffersize = 64000;
408 Bool_t status = kTRUE;
415 // Make the branch for the digits
420 const AliTRDarraySignal *kDigits = (AliTRDarraySignal *) fDigits->At(0);
423 if (!fTree) return kFALSE;
424 AliDebug(1,"Making branch for SDigits!\n");
425 TBranch *branch = fTree->GetBranch("TRDdigits");
428 fTree->Branch("TRDdigits","AliTRDarraySignal",&kDigits,buffersize,99);
430 AliDebug(1,"Making branch TRDdigits\n");
440 const AliTRDarrayADC *kDigits = (AliTRDarrayADC *) fDigits->At(0);
443 if (!fTree) return kFALSE;
444 AliDebug(1,"Making branch for Digits!\n");
445 TBranch *branch = fTree->GetBranch("TRDdigits");
448 fTree->Branch("TRDdigits","AliTRDarrayADC",&kDigits,buffersize,99);
450 AliDebug(1,"Making branch TRDdigits\n");
466 if (fUseDictionaries)
468 // Make the branches for the dictionaries
469 for (Int_t iDict = 0; iDict < kNDict; iDict++)
471 Char_t branchname[15];
472 sprintf(branchname,"TRDdictionary%d",iDict);
475 const AliTRDarrayDictionary *kDictionary = (AliTRDarrayDictionary *) fDict[iDict]->At(0);
478 if (!fTree) return kFALSE;
479 AliDebug(2,"Making branch for dictionary!\n");
480 TBranch *branch = fTree->GetBranch(branchname);
483 fTree->Branch(branchname,"AliTRDarrayDictionary",&kDictionary,buffersize,99);
485 AliDebug(1,Form("Making branch %s\n",branchname));
501 const AliTRDdigitsParam *kDigitsParam = fDigitsParam;
502 if (!fTree) return kFALSE;
503 TBranch *branch = fTree->GetBranch("TRDdigitsParam");
506 fTree->Branch("TRDdigitsParam","AliTRDdigitsParam",&kDigitsParam,buffersize,99);
508 AliDebug(1,"Making branch AliTRDdigitsParam\n");
515 //_____________________________________________________________________________
516 Bool_t AliTRDdigitsManager::ReadDigits(TTree * const tree)
519 // Reads the digit information from the input file
522 Bool_t status = kTRUE;
531 AliDebug(1,"Create the data arrays.\n");
535 status = LoadArrayDigits();
537 if (fUseDictionaries)
539 status = LoadArrayDict();
540 if (status == kFALSE)
542 fUseDictionaries = kFALSE;
543 AliWarning("Unable to load dict arrays. Will not use them.\n");
547 if (!LoadDigitsParam()) {
548 AliWarning("Could not read digits parameter.");
552 AliWarning(Form("Create default version of digits parameter (NTimeBin=%d).\n"
553 ,AliTRDSimParam::Instance()->GetNTimeBins()));
554 fDigitsParam = new AliTRDdigitsParam();
555 fDigitsParam->SetNTimeBins(AliTRDSimParam::Instance()->GetNTimeBins());
556 fDigitsParam->SetADCbaseline(AliTRDSimParam::Instance()->GetADCbaseline());
563 //_____________________________________________________________________________
564 Bool_t AliTRDdigitsManager::WriteDigits()
567 // Writes out the TRD-digits and the dictionaries
570 if (!StoreArrayDigits())
572 AliError("Error while storing digits\n");
576 if (fUseDictionaries)
578 if (!StoreArrayDict())
580 AliError("Error while storing dictionaries in branch\n");
585 // Write the new tree to the output file
592 //_____________________________________________________________________________
593 AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row
599 // Creates a single digit object
610 amp[0] = ((AliTRDarrayADC *) GetDigits(det))->GetData(row,col,time);
612 return (new AliTRDdigit(digits,amp));
616 //_____________________________________________________________________________
617 Int_t AliTRDdigitsManager::GetTrack(Int_t track
624 // Returns the MC-track numbers from the dictionary.
627 if ((track < 0) || (track >= kNDict))
629 AliError(Form("track %d out of bounds (size: %d, this: 0x%08x)",track,kNDict,this));
633 if (fUseDictionaries == kFALSE)
638 // Array contains index+1 to allow data compression--->Changed
639 return (((AliTRDarrayDictionary *) GetDictionary(det,track))->GetData(row,col,time) );
643 //________________________________________________________________________________
644 AliTRDarrayADC *AliTRDdigitsManager::GetDigits(Int_t det) const
647 // Returns the digits array for one detector
650 Int_t recoDet = fRawRec ? 0 : det;
659 ((AliTRDarrayADC *) fDigits->At(recoDet))->SetNdet(det);
660 return (AliTRDarrayADC *) fDigits->At(recoDet);
664 AliDebug(2,"ERROR IN DATA TYPE!!!!");
670 //_____________________________________________________________________________
671 AliTRDarraySignal *AliTRDdigitsManager::GetSDigits(Int_t det) const
674 // Returns the sdigits array for one detector
677 Int_t recoDet = fRawRec ? 0 : det;
681 // AliDebug(1,"NO FDIGITS!");
687 ((AliTRDarraySignal *) fDigits->At(recoDet))->SetNdet(det);
688 return (AliTRDarraySignal *) fDigits->At(recoDet);
692 AliDebug(2,"ERROR IN DATA TYPE!!!!");
698 //_____________________________________________________________________________
699 AliTRDarrayDictionary *AliTRDdigitsManager::GetDictionary(Int_t det
703 // Returns the dictionary for one detector
706 Int_t recoDet = fRawRec ? 0 : det;
708 if (fUseDictionaries == kFALSE)
713 ((AliTRDarrayDictionary *) fDigits->At(recoDet))->SetNdet(det);
714 return (AliTRDarrayDictionary *) fDict[i]->At(recoDet);
718 //_____________________________________________________________________________
719 Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit * const digit) const
722 // Returns the MC-track numbers from the dictionary for a given digit
725 Int_t row = digit->GetRow();
726 Int_t col = digit->GetCol();
727 Int_t time = digit->GetTime();
728 Int_t det = digit->GetDetector();
730 return GetTrack(track,row,col,time,det);
734 //_____________________________________________________________________________
735 AliTRDSignalIndex *AliTRDdigitsManager::GetIndexes(Int_t det)
738 // Returns indexes of active pads
741 Int_t recoDet = fRawRec ? 0 : det;
743 return (AliTRDSignalIndex *) fSignalIndexes->At(recoDet);
747 //_____________________________________________________________________________
748 void AliTRDdigitsManager::RemoveDigits(Int_t det)
751 // Clear memory at det for Digits
754 Int_t recoDet = fRawRec ? 0 : det;
756 if (fDigits->At(recoDet))
760 AliTRDarraySignal *arr = (AliTRDarraySignal *) fDigits->RemoveAt(recoDet);
765 AliTRDarrayADC *arr = (AliTRDarrayADC *) fDigits->RemoveAt(recoDet);
772 //_____________________________________________________________________________
773 void AliTRDdigitsManager::RemoveDictionaries(Int_t det)
779 Int_t recoDet = fRawRec ? 0 : det;
781 if (fUseDictionaries == kFALSE)
786 for (Int_t i = 0; i < kNDict; i++)
788 if (fDict[i]->At(recoDet))
790 AliTRDarrayDictionary *arr = (AliTRDarrayDictionary *) fDict[i]->RemoveAt(recoDet);
797 //_____________________________________________________________________________
798 void AliTRDdigitsManager::RemoveIndexes(Int_t det)
804 Int_t recoDet = fRawRec ? 0 : det;
806 if (fSignalIndexes->At(recoDet))
808 AliTRDSignalIndex *arr = (AliTRDSignalIndex *) fSignalIndexes->RemoveAt(recoDet);
814 //_____________________________________________________________________________
815 void AliTRDdigitsManager::ClearIndexes(Int_t det)
821 Int_t recoDet = fRawRec ? 0 : det;
823 ((AliTRDSignalIndex *) fSignalIndexes->At(recoDet))->ClearAll();
827 //_____________________________________________________________________________
828 Bool_t AliTRDdigitsManager::BuildIndexes(Int_t det)
831 // Build the list of indices
839 AliTRDarrayADC *digits = 0x0;
847 digits = (AliTRDarrayADC *) GetDigits(det);
850 // digits should be expanded by now!!!
851 if (digits->GetNtime() > 0)
854 nRows = digits->GetNrow();
855 nCols = digits->GetNcol();
856 nTbins = digits->GetNtime();
858 AliTRDSignalIndex *indexes = GetIndexes(det);
859 indexes->SetSM(geom.GetSector(det));
860 indexes->SetStack(geom.GetStack(det));
861 indexes->SetLayer(geom.GetLayer(det));
862 indexes->SetDetNumber(det);
864 if (indexes->IsAllocated() == kFALSE)
866 indexes->Allocate(nRows,nCols,nTbins);
869 for (Int_t ir = 0; ir < nRows; ir++)
871 for (Int_t ic = 0; ic < nCols; ic++)
873 for (Int_t it = 0; it < nTbins; it++)
875 Int_t isig = digits->GetDataBits(ir,ic,it);
878 indexes->AddIndexRC(ir,ic);
894 //_____________________________________________________________________________
895 Bool_t AliTRDdigitsManager::LoadArrayDigits()
898 // Loads the (s-)digits arrays for all detectors
903 AliError("Digits tree is not defined\n");
907 Bool_t status = kTRUE;
910 TBranch *branch = fTree->GetBranch("TRDdigits");
913 AliError("Branch TRDdigits is not defined\n");
917 // Loop through all detectors and read them from the tree
918 for (Int_t iDet = 0; iDet < fDets; iDet++)
922 AliTRDarraySignal *dataArray = (AliTRDarraySignal *) fDigits->At(iDet);
928 branch->SetAddress(&dataArray);
929 branch->GetEntry(iDet);
933 AliTRDarrayADC *dataArray = (AliTRDarrayADC *) fDigits->At(iDet);
939 branch->SetAddress(&dataArray);
940 branch->GetEntry(iDet);
948 //________________________________________________________________________________________________
949 Bool_t AliTRDdigitsManager::LoadArrayDict()
952 // Loads dictionary arrays for all detectors
957 AliError("Digits tree is not defined\n");
961 Bool_t status = kTRUE;
963 for (Int_t iDict = 0; iDict < kNDict; iDict++)
967 Char_t branchname[15];
968 sprintf(branchname,"TRDdictionary%d",iDict);
969 TBranch *branch = fTree->GetBranch(branchname);
972 AliError(Form("Branch %s is not defined\n",branchname));
976 // Loop through all detectors and read them from the tree
977 for (Int_t iDet = 0; iDet < fDets; iDet++)
979 AliTRDarrayDictionary *dataArray = (AliTRDarrayDictionary *) fDict[iDict]->At(iDet);
985 branch->SetAddress(&dataArray);
986 branch->GetEntry(iDet);
995 //_____________________________________________________________________________
996 Bool_t AliTRDdigitsManager::LoadDigitsParam()
999 // Loads the digits parameter object from the digits tree
1004 AliError("Digits tree is not defined\n");
1009 TBranch *branch = fTree->GetBranch("TRDdigitsParam");
1012 AliError("Branch TRDdigitsParam is not defined\n");
1016 // Read the parameter object
1017 AliTRDdigitsParam *digitsParam = fDigitsParam;
1023 branch->SetAddress(&digitsParam);
1030 //_____________________________________________________________________________
1031 Bool_t AliTRDdigitsManager::StoreArrayDigits()
1034 // Stores the digit arrays for all detectors
1039 AliError("Digits tree is not defined\n");
1044 TBranch *branch = fTree->GetBranch("TRDdigits");
1047 AliError("Branch TRDdigits is not defined\n");
1051 // Loop through all detectors and fill them into the tree
1052 Bool_t status = kTRUE;
1053 for (Int_t iDet = 0; iDet < fDets; iDet++)
1057 const AliTRDarraySignal *kDataArray = (AliTRDarraySignal *) fDigits->At(iDet);
1063 branch->SetAddress(&kDataArray);
1068 const AliTRDarrayADC *kDataArray = (AliTRDarrayADC *) fDigits->At(iDet);
1074 branch->SetAddress(&kDataArray);
1083 //_____________________________________________________________________________
1084 Bool_t AliTRDdigitsManager::StoreArrayDict()
1087 // Stores the dictionary arrays for all detectors
1092 AliError("Digits tree is not defined\n");
1096 Bool_t status = kTRUE;
1098 for (Int_t iDict = 0; iDict < kNDict; iDict++)
1102 Char_t branchname[15];
1103 sprintf(branchname,"TRDdictionary%d",iDict);
1104 TBranch *branch = fTree->GetBranch(branchname);
1107 AliError(Form("Branch %s is not defined\n",branchname));
1111 // Loop through all detectors and fill them into the tree
1112 for (Int_t iDet = 0; iDet < fDets; iDet++)
1114 const AliTRDarrayDictionary *kDataArray = (AliTRDarrayDictionary *) fDict[iDict]->At(iDet);
1120 branch->SetAddress(&kDataArray);
1130 //_____________________________________________________________________________
1131 Bool_t AliTRDdigitsManager::StoreDigitsParam()
1134 // Stores the digits parameter object from the digits tree
1139 AliError("Digits tree is not defined\n");
1144 TBranch *branch = fTree->GetBranch("TRDdigitsParam");
1147 AliError("Branch TRDdigitsParam is not defined\n");
1151 // Fill the digits object in the tree
1152 const AliTRDdigitsParam *kDigitsParam = fDigitsParam;
1157 branch->SetAddress(&kDigitsParam);