/** @file CbmMCDataArray.cxx ** @author //Dr.Sys **/ #include "CbmMCDataArray.h" #include "TClonesArray.h" #include "TChain.h" #include "FairRootManager.h" #include "FairLogger.h" #include using namespace std; // --- Standard constructor CbmMCDataArray::CbmMCDataArray(const char* branchname, const std::vector >& fileList) : fLegacy(0), fLegacyArray(nullptr), fBranchName(branchname), fSize(-1111), fChains(), fTArr(), fN(), fArrays() { list::const_iterator p; Int_t i; Int_t s=fileList.size(); fSize=s; fChains.resize(s); fTArr.resize(s); fN.resize(s); for(i=0;iAddFile(*p); fChains[i]->SetBranchAddress(branchname, &(fTArr[i])); fN[i]=fChains[i]->GetEntries(); } fArrays.resize(s); for(i=0;i=static_cast(fChains.size()) || fChains[chainNum1]==nullptr) { LOG(error) << "chainNum1=" << chainNum1 << " is not a correct chain number."; return; } if (chainNum2<0 || chainNum2>=static_cast(fChains.size()) || fChains[chainNum2]==nullptr) { LOG(error) << "chainNum2=" << chainNum2 << " is not a correct chain number."; return; } fChains[chainNum1]->AddFriend(fChains[chainNum2]); } // --- Legacy constructor CbmMCDataArray::CbmMCDataArray(const char* branchname) : fLegacy(1), fLegacyArray(nullptr), fBranchName(branchname), fSize(-1111), fChains(), fTArr(), fN(), fArrays() { FairRootManager* fManager=FairRootManager::Instance(); if (!fManager) { LOG(fatal) << "CbmMCDataArray(): Can't find a Root Manager."; return; } fLegacyArray=(TClonesArray*)fManager->GetObject(branchname); if (!fLegacyArray) { LOG(fatal) << "CbmMCDataArray(): Can't find " << fBranchName << " in the system."; return; } } // --- Legacy Get TObject* CbmMCDataArray::LegacyGet(Int_t fileNumber, Int_t eventNumber, Int_t index) { if (fileNumber>=0||eventNumber>=0) LOG(debug1) << "LegacyGet: Trying to get object with fileNum=" << fileNumber << ", entryNum=" << eventNumber << " in legacy mode."; if (index<0) return 0; return fLegacyArray->At(index); } // --- Get an object TObject* CbmMCDataArray::Get(Int_t fileNumber, Int_t eventNumber, Int_t index) { if (fLegacy==1) return LegacyGet(fileNumber, eventNumber, index); if (fileNumber<0||fileNumber>=fSize) return nullptr; if (eventNumber<0||eventNumber>=fN[fileNumber]) return nullptr; if (index<0) return nullptr; // --- Cached arrays map &arr=fArrays[fileNumber]; // --- If the array for this event is already in the cache, use it. if (arr.find(eventNumber)!=arr.end()) return arr[eventNumber]->At(index); // --- If not, copy the array from the chain into the cache TChain* ch=fChains[fileNumber]; ch->GetEntry(eventNumber); arr[eventNumber]=(TClonesArray*)(fTArr[fileNumber]->Clone()); return arr[eventNumber]->At(index); } // --- Get a size of TClonesArray . Slow if TClonesArray not in cache Int_t CbmMCDataArray::Size(Int_t fileNumber, Int_t eventNumber) { if (fLegacy==1) return fLegacyArray->GetEntriesFast(); if (fileNumber<0||fileNumber>=fSize) return -1111; if (eventNumber<0||eventNumber>=fN[fileNumber]) return -1111; // --- Cached arrays map &arr=fArrays[fileNumber]; // --- If the array for this event is already in the cache, use it. if (arr.find(eventNumber)!=arr.end()) return arr[eventNumber]->GetEntriesFast(); // --- If not, get the array from the chain (slow) TChain* ch=fChains[fileNumber]; ch->GetEntry(eventNumber); return fTArr[fileNumber]->GetEntriesFast(); } // --- At end of one event: clear the cache to free the memory void CbmMCDataArray::FinishEvent() { if (fLegacy==1) return; Int_t i; map::const_iterator p; for(i=0;isecond); fArrays[i].clear(); } } // --- Clean up void CbmMCDataArray::Done() { if (fLegacy==1) return; Int_t i; FinishEvent(); for(i=0;i