X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDdigitsManager.cxx;h=77cd0a9c95fbab4ce81ce479628e0599f08ffad3;hb=4bde6625128424769e83c2af9d0e93ef84031cd0;hp=2279d744a319545f7d469dbac8506d9c555ca220;hpb=88cb7938ca21d4a80991d4e7aa564008c29340f7;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDdigitsManager.cxx b/TRD/AliTRDdigitsManager.cxx index 2279d744a31..77cd0a9c95f 100644 --- a/TRD/AliTRDdigitsManager.cxx +++ b/TRD/AliTRDdigitsManager.cxx @@ -29,13 +29,18 @@ #include #include "AliRun.h" +#include "AliLog.h" #include "AliTRDdigitsManager.h" #include "AliTRDsegmentArray.h" +#include "AliTRDdataArray.h" #include "AliTRDdataArrayI.h" +#include "AliTRDdataArrayS.h" +#include "AliTRDdataArrayDigits.h" #include "AliTRDdigit.h" #include "AliTRDgeometry.h" -#include "AliTRD.h" + +#include "AliTRDSignalIndex.h" ClassImp(AliTRDdigitsManager) @@ -45,34 +50,41 @@ ClassImp(AliTRDdigitsManager) const Int_t AliTRDdigitsManager::fgkNDict = kNDict; //_____________________________________________________________________________ -AliTRDdigitsManager::AliTRDdigitsManager():TObject() +AliTRDdigitsManager::AliTRDdigitsManager() + :TObject() + ,fEvent(0) + ,fTree(0) + ,fDigits(0) + ,fHasSDigits(0) + ,fSignalIndexes(NULL) + ,fUseDictionaries(kTRUE) { // // Default constructor // - fIsRaw = kFALSE; - fEvent = 0; - fDebug = 0; - fSDigits = 0; - - fTree = NULL; - fDigits = NULL; for (Int_t iDict = 0; iDict < kNDict; iDict++) { fDictionary[iDict] = NULL; } - + + fSignalIndexes = new TObjArray(AliTRDgeometry::Ndet()); + } //_____________________________________________________________________________ AliTRDdigitsManager::AliTRDdigitsManager(const AliTRDdigitsManager &m) + :TObject(m) + ,fEvent(m.fEvent) + ,fTree(0) + ,fDigits(0) + ,fHasSDigits(m.fHasSDigits) + ,fSignalIndexes(NULL) + ,fUseDictionaries(kTRUE) { // // AliTRDdigitsManager copy constructor // - ((AliTRDdigitsManager &) m).Copy(*this); - } //_____________________________________________________________________________ @@ -85,7 +97,7 @@ AliTRDdigitsManager::~AliTRDdigitsManager() if (fDigits) { fDigits->Delete(); delete fDigits; - fDigits = NULL; + fDigits = NULL; } for (Int_t iDict = 0; iDict < kNDict; iDict++) { @@ -94,19 +106,41 @@ AliTRDdigitsManager::~AliTRDdigitsManager() fDictionary[iDict] = NULL; } + if (fSignalIndexes) { + fSignalIndexes->Delete(); + delete fSignalIndexes; + fSignalIndexes = NULL; + } + +} + +//_____________________________________________________________________________ +AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m) +{ + // + // Assignment operator + // + + if (this != &m) { + ((AliTRDdigitsManager &) m).Copy(*this); + } + + return *this; + } //_____________________________________________________________________________ -void AliTRDdigitsManager::Copy(TObject &m) +void AliTRDdigitsManager::Copy(TObject &m) const { // // Copy function // - ((AliTRDdigitsManager &) m).fIsRaw = fIsRaw; - ((AliTRDdigitsManager &) m).fEvent = fEvent; - ((AliTRDdigitsManager &) m).fDebug = fDebug; - ((AliTRDdigitsManager &) m).fSDigits = fSDigits; + ((AliTRDdigitsManager &) m).fEvent = fEvent; + ((AliTRDdigitsManager &) m).fHasSDigits = fHasSDigits; + + ((AliTRDdigitsManager &) m).fSignalIndexes = fSignalIndexes; + ((AliTRDdigitsManager &) m).fUseDictionaries = fUseDictionaries; TObject::Copy(m); @@ -119,14 +153,26 @@ void AliTRDdigitsManager::CreateArrays() // Create the data arrays // - fDigits = new AliTRDsegmentArray("AliTRDdataArrayI",AliTRDgeometry::Ndet()); + if (fHasSDigits) { + fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet()); + } + else { + fDigits = new AliTRDsegmentArray("AliTRDdataArrayDigits",AliTRDgeometry::Ndet()); + } - for (Int_t iDict = 0; iDict < kNDict; iDict++) { - fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI" - ,AliTRDgeometry::Ndet()); + if (fUseDictionaries) { + for (Int_t iDict = 0; iDict < kNDict; iDict++) { + fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI" + ,AliTRDgeometry::Ndet()); + } + } + + for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) { + fSignalIndexes->AddLast(new AliTRDSignalIndex()); } } + //_____________________________________________________________________________ void AliTRDdigitsManager::ResetArrays() { @@ -135,31 +181,32 @@ void AliTRDdigitsManager::ResetArrays() // if (fDigits) { + fDigits->Delete(); delete fDigits; } - fDigits = new AliTRDsegmentArray("AliTRDdataArrayI",AliTRDgeometry::Ndet()); + if (fHasSDigits) { + fDigits = new AliTRDsegmentArray("AliTRDdataArrayF",AliTRDgeometry::Ndet()); + } + else { + fDigits = new AliTRDsegmentArray("AliTRDdataArrayS",AliTRDgeometry::Ndet()); + } - for (Int_t iDict = 0; iDict < kNDict; iDict++) { - if (fDictionary[iDict]) { - delete fDictionary[iDict]; + if (fUseDictionaries) { + for (Int_t iDict = 0; iDict < kNDict; iDict++) { + if (fDictionary[iDict]) { + fDictionary[iDict]->Delete(); + delete fDictionary[iDict]; + } + fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI" + ,AliTRDgeometry::Ndet()); } - fDictionary[iDict] = new AliTRDsegmentArray("AliTRDdataArrayI" - ,AliTRDgeometry::Ndet()); } -} - -//_____________________________________________________________________________ -void AliTRDdigitsManager::SetRaw() -{ - // - // Switch on the raw digits flag - // - - fIsRaw = kTRUE; + for (Int_t i = 0; i < AliTRDgeometry::Ndet(); i++) { + AliTRDSignalIndex *idx = (AliTRDSignalIndex *)fSignalIndexes->At(i); + if (idx) idx->Reset(); + } - fDigits->SetBit(AliTRDdigit::RawDigit()); - } //_____________________________________________________________________________ @@ -170,10 +217,29 @@ Short_t AliTRDdigitsManager::GetDigitAmp(Int_t row, Int_t col,Int_t time // Returns the amplitude of a digit // - return ((Short_t) GetDigits(det)->GetData(row,col,time)); + if (!GetDigits(det)) { + return 0; + } + + return ((Short_t) ((AliTRDdataArrayDigits *) GetDigits(det))->GetData(row,col,time)); } +//_____________________________________________________________________________ +UChar_t AliTRDdigitsManager::GetPadStatus(Int_t row, Int_t col, Int_t time + , Int_t det) const +{ + // + // Returns the pad status for the requested pad + // + + if(!GetDigits(det)){ + return 0; + } + + return ((UChar_t)((AliTRDdataArrayDigits *) GetDigits(det))->GetPadStatus(row, col, time)); +} + //_____________________________________________________________________________ Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree) { @@ -185,8 +251,6 @@ Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree) Bool_t status = kTRUE; - AliTRD *trd = (AliTRD *) gAlice->GetDetector("TRD") ; - if (tree) { fTree = tree; } @@ -195,12 +259,11 @@ Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree) if (fDigits) { const AliTRDdataArray *kDigits = (AliTRDdataArray *) fDigits->At(0); if (kDigits) { - trd->MakeBranchInTree(fTree,"TRDdigits",kDigits->IsA()->GetName() - ,&kDigits,buffersize,99); - if (fDebug > 0) { - printf(" "); - printf("Making branch TRDdigits\n"); - } + if (!fTree) return kFALSE; + TBranch* branch = fTree->GetBranch("TRDdigits"); + if (!branch) fTree->Branch("TRDdigits",kDigits->IsA()->GetName() + ,&kDigits,buffersize,99); + AliDebug(1,"Making branch TRDdigits\n"); } else { status = kFALSE; @@ -210,28 +273,29 @@ Bool_t AliTRDdigitsManager::MakeBranch(TTree *tree) status = kFALSE; } - // Make the branches for the dictionaries - for (Int_t iDict = 0; iDict < kNDict; iDict++) { - Char_t branchname[15]; - sprintf(branchname,"TRDdictionary%d",iDict); - if (fDictionary[iDict]) { - const AliTRDdataArray *kDictionary = - (AliTRDdataArray *) fDictionary[iDict]->At(0); - if (kDictionary) { - trd->MakeBranchInTree(fTree,branchname,kDictionary->IsA()->GetName() - ,&kDictionary,buffersize,99); - if (fDebug > 0) { - printf(" "); - printf("Making branch %s\n",branchname); + if (fUseDictionaries) { + // Make the branches for the dictionaries + for (Int_t iDict = 0; iDict < kNDict; iDict++) { + Char_t branchname[15]; + sprintf(branchname,"TRDdictionary%d",iDict); + if (fDictionary[iDict]) { + const AliTRDdataArray *kDictionary = + (AliTRDdataArray *) fDictionary[iDict]->At(0); + if (kDictionary) { + if (!fTree) return kFALSE; + TBranch* branch = fTree->GetBranch(branchname); + if (!branch) fTree->Branch(branchname,kDictionary->IsA()->GetName() + ,&kDictionary,buffersize,99); + AliDebug(1,Form("Making branch %s\n",branchname)); + } + else { + status = kFALSE; } } else { - status = kFALSE; + status = kFALSE; } } - else { - status = kFALSE; - } } return status; @@ -248,32 +312,27 @@ Bool_t AliTRDdigitsManager::ReadDigits(TTree *tree) Bool_t status = kTRUE; if (tree) { - fTree = tree; - } if (!fDigits) { - if (fDebug > 0) { - printf(" "); - printf("Create the data arrays.\n"); - } + AliDebug(1,"Create the data arrays.\n"); CreateArrays(); } status = fDigits->LoadArray("TRDdigits",fTree); - for (Int_t iDict = 0; iDict < kNDict; iDict++) { - Char_t branchname[15]; - sprintf(branchname,"TRDdictionary%d",iDict); - status = fDictionary[iDict]->LoadArray(branchname,fTree); - } - - if (fDigits->TestBit(AliTRDdigit::RawDigit())) { - fIsRaw = kTRUE; - } - else { - fIsRaw = kFALSE; + if (fUseDictionaries) { + for (Int_t iDict = 0; iDict < kNDict; iDict++) { + Char_t branchname[15]; + sprintf(branchname,"TRDdictionary%d",iDict); + status = fDictionary[iDict]->LoadArray(branchname,fTree); + if (status == kFALSE) { + fUseDictionaries = kFALSE; + AliWarning("Unable to load dict arrays. Will not use them.\n"); + break; + } + } } return kTRUE; @@ -289,22 +348,22 @@ Bool_t AliTRDdigitsManager::WriteDigits() // Store the contents of the segment array in the tree if (!fDigits->StoreArray("TRDdigits",fTree)) { - printf(" "); - printf("Error while storing digits in branch TRDdigits\n"); + AliError("Error while storing digits in branch TRDdigits\n"); return kFALSE; } - for (Int_t iDict = 0; iDict < kNDict; iDict++) { - Char_t branchname[15]; - sprintf(branchname,"TRDdictionary%d",iDict); - if (!fDictionary[iDict]->StoreArray(branchname,fTree)) { - printf(" "); - printf("Error while storing dictionary in branch %s\n",branchname); - return kFALSE; + + if (fUseDictionaries) { + for (Int_t iDict = 0; iDict < kNDict; iDict++) { + Char_t branchname[15]; + sprintf(branchname,"TRDdictionary%d",iDict); + if (!fDictionary[iDict]->StoreArray(branchname,fTree)) { + AliError(Form("Error while storing dictionary in branch %s\n",branchname)); + return kFALSE; + } } } // Write the new tree to the output file - //fTree->Write(); fTree->AutoSave(); // Modification by Jiri return kTRUE; @@ -327,9 +386,9 @@ AliTRDdigit *AliTRDdigitsManager::GetDigit(Int_t row, Int_t col digits[2] = col; digits[3] = time; - amp[0] = GetDigits(det)->GetData(row,col,time); + amp[0] = ((AliTRDdataArrayDigits *) GetDigits(det))->GetData(row,col,time); - return (new AliTRDdigit(fIsRaw,digits,amp)); + return (new AliTRDdigit(digits,amp)); } @@ -343,36 +402,47 @@ Int_t AliTRDdigitsManager::GetTrack(Int_t track // if ((track < 0) || (track >= kNDict)) { - TObject::Error("GetTracks" - ,"track %d out of bounds (size: %d, this: 0x%08x)" - ,track,kNDict,this); + AliError(Form("track %d out of bounds (size: %d, this: 0x%08x)" + ,track,kNDict,this)); + return -1; + } + + if (fUseDictionaries == kFALSE) { return -1; } // Array contains index+1 to allow data compression - return (GetDictionary(det,track)->GetData(row,col,time) - 1); + return (((AliTRDdataArrayI *) GetDictionary(det,track))->GetData(row,col,time) - 1); } //_____________________________________________________________________________ -AliTRDdataArrayI *AliTRDdigitsManager::GetDigits(Int_t det) const +AliTRDdataArrayDigits *AliTRDdigitsManager::GetDigits(Int_t det) const { // // Returns the digits array for one detector // - return (AliTRDdataArrayI *) fDigits->At(det); + if (!fDigits) { + return 0x0; + } + + return (AliTRDdataArrayDigits *) fDigits->At(det); } //_____________________________________________________________________________ -AliTRDdataArrayI *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const +AliTRDdataArray *AliTRDdigitsManager::GetDictionary(Int_t det, Int_t i) const { // // Returns the dictionary for one detector // - return (AliTRDdataArrayI *) fDictionary[i]->At(det); + if (fUseDictionaries == kFALSE) { + return 0x0; + } + + return (AliTRDdataArray *) fDictionary[i]->At(det); } @@ -393,13 +463,111 @@ Int_t AliTRDdigitsManager::GetTrack(Int_t track, AliTRDdigit *Digit) const } //_____________________________________________________________________________ -AliTRDdigitsManager &AliTRDdigitsManager::operator=(const AliTRDdigitsManager &m) +AliTRDSignalIndex *AliTRDdigitsManager::GetIndexes(Int_t det) { + // + // Returns indexes of active pads // - // Assignment operator + + return (AliTRDSignalIndex *) fSignalIndexes->At(det); + +} + +//_____________________________________________________________________________ +void AliTRDdigitsManager::RemoveDigits(Int_t det) +{ + // + // Clear memory // - if (this != &m) ((AliTRDdigitsManager &) m).Copy(*this); - return *this; + fDigits->ClearSegment(det); + +} + +//_____________________________________________________________________________ +void AliTRDdigitsManager::RemoveDictionaries(Int_t det) +{ + // + // Clear memory + // + + if (fUseDictionaries == kFALSE) { + return; + } + + for (Int_t i = 0; i < kNDict; i++) { + fDictionary[i]->ClearSegment(det); + } + +} + +//_____________________________________________________________________________ +void AliTRDdigitsManager::ClearIndexes(Int_t det) +{ + // + // Clear memory + // + + ((AliTRDSignalIndex*)fSignalIndexes->At(det))->ClearAll(); + +} + +//_____________________________________________________________________________ +Bool_t AliTRDdigitsManager::BuildIndexes(Int_t det) +{ + // + // Build the list of indices + // + + Int_t nRows = 0; + Int_t nCols = 0; + Int_t nTbins = 0; + + AliTRDgeometry geom; + AliTRDdataArrayDigits *digits = 0x0; + + if (fHasSDigits) { + return kFALSE; + } + else { + digits = (AliTRDdataArrayDigits *) GetDigits(det); + } + + //digits should be expanded by now!!! + if (digits->GetNtime() > 0) { + + digits->Expand(); + nRows = digits->GetNrow(); + nCols = digits->GetNcol(); + nTbins = digits->GetNtime(); + + AliTRDSignalIndex *indexes = GetIndexes(det); + indexes->SetSM(geom.GetSector(det)); + indexes->SetChamber(geom.GetChamber(det)); + indexes->SetPlane(geom.GetPlane(det)); + indexes->SetDetNumber(det); + + if (indexes->IsAllocated() == kFALSE) { + indexes->Allocate(nRows,nCols,nTbins); + } + + for (Int_t ir = 0; ir < nRows; ir++) { + for (Int_t ic = 0; ic < nCols; ic++) { + for (Int_t it = 0; it < nTbins; it++) { + + Int_t isig = digits->GetDataUnchecked(ir,ic,it); + if (isig > 0) { + indexes->AddIndexTBin(ir,ic,it); + } + } // tbins + } // cols + } // rows + + } // if GetNtime + else { + return kFALSE; + } + + return kTRUE; }