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