diff --git a/reco/detectors/trd/CbmTrdClusterFinder.cxx b/reco/detectors/trd/CbmTrdClusterFinder.cxx index 2d239d67ca44f3160ad914006feb23aff0f2110a..d470d6825f368b2a38a02166ab9e1e91326bd316 100644 --- a/reco/detectors/trd/CbmTrdClusterFinder.cxx +++ b/reco/detectors/trd/CbmTrdClusterFinder.cxx @@ -79,12 +79,24 @@ Bool_t CbmTrdClusterFinder::AddCluster(CbmTrdCluster* c) // ---- addDigisToModules ---- UInt_t CbmTrdClusterFinder::addDigisToModules() { + const int NDIGICHUNK = 100; // force flush of cluster buffer once every NDIGICHUNK digi to avoid memory exhaustion + UInt_t ndigis = static_cast<UInt_t>(std::abs(CbmDigiManager::Instance()->GetNofDigis(ECbmModuleId::kTrd))); if (ndigis == 0) return 0; - for (size_t idigi = 0; idigi < ndigis; idigi++) { + + int jdigi(0); + for (size_t idigi(0); idigi < ndigis; idigi++) { addDigiToModule(idigi); + // once in a while dump finished clusters + // TODO ad hoc condition. Maybe a find a better one + if (jdigi >= NDIGICHUNK) { + processDigisInModules(jdigi, nullptr, false); + jdigi = 0; + } + else + jdigi++; } - return ndigis; + return jdigi; } // ---- addDigisToModules ---- @@ -118,14 +130,16 @@ void CbmTrdClusterFinder::addDigiToModule(UInt_t digiIdx) } // ---- processDigisInModules ---- -void CbmTrdClusterFinder::processDigisInModules(UInt_t ndigis, CbmEvent* event) +void CbmTrdClusterFinder::processDigisInModules(UInt_t ndigis, CbmEvent* event, bool clr) { + // printf("AB :: processDigisInModules(%d, %p) clr[%c]\n", ndigis, (void*) event, (clr?'Y':'N')); + CbmTrdModuleRec* mod(NULL); Int_t digiCounter(0), clsCounter(0); for (std::map<Int_t, CbmTrdModuleRec*>::iterator imod = fModules.begin(); imod != fModules.end(); imod++) { mod = imod->second; digiCounter += mod->GetOverThreshold(); - clsCounter += mod->FindClusters(); + clsCounter += mod->FindClusters(event || clr); AddClusters(mod->GetClusters(), event, kTRUE); } diff --git a/reco/detectors/trd/CbmTrdClusterFinder.h b/reco/detectors/trd/CbmTrdClusterFinder.h index 99a48d1ee8818034d4b5a55b7c3a1fcb997f9f14..c01df96f91713d4df47027d71da06c79a13c084f 100644 --- a/reco/detectors/trd/CbmTrdClusterFinder.h +++ b/reco/detectors/trd/CbmTrdClusterFinder.h @@ -187,10 +187,11 @@ private: /** * @brief Call the clusterizer function of each module * - * @param ndigis - * @param event + * @param ndigis total number of digis processed + * @param event link to digi event in case event-by-event reco is activated + * @param clr force clear clusters buffers */ - void processDigisInModules(UInt_t ndigis, CbmEvent* event = nullptr); + void processDigisInModules(UInt_t ndigis, CbmEvent* event = nullptr, bool clr = true); /** * @brief Adds the module corresponding to the address of the passed digi to the ModuleMap (fModules) diff --git a/reco/detectors/trd/CbmTrdModuleRec.h b/reco/detectors/trd/CbmTrdModuleRec.h index 93dbc1c2e81432041fedd476e3ebab1c513907cb..bace9c2a79c6226346bcc52c1a8fcb5eff5448bc 100644 --- a/reco/detectors/trd/CbmTrdModuleRec.h +++ b/reco/detectors/trd/CbmTrdModuleRec.h @@ -45,7 +45,7 @@ public: /** * \brief Steering routine for finding digits clusters **/ - virtual Int_t FindClusters() = 0; + virtual Int_t FindClusters(bool clr = true) = 0; virtual Int_t GetOverThreshold() const { return 0; } virtual TClonesArray* GetClusters() { return fClusters; } virtual const TClonesArray* GetClusters() const { return fClusters; }