/** @file CbmMCBuffer.cxx ** @author Volker Friese ** @date 17 July 2012 **/ #include #include #include #include #include "TString.h" #include "FairLogger.h" #include "CbmDaqBuffer.h" #include "CbmModuleList.h" using std::setprecision; using std::stringstream; using std::fixed; using std::string; using std::pair; using std::multimap; // ----- Constructor ----------------------------------------------------- CbmDaqBuffer::CbmDaqBuffer() { } // --------------------------------------------------------------------------- // ----- Destructor ------------------------------------------------------ CbmDaqBuffer::~CbmDaqBuffer() { } // --------------------------------------------------------------------------- // ----- Time of first raw data ------------------------------------------ Double_t CbmDaqBuffer::GetFirstTime() const { Double_t time = -1.; Bool_t firstDetector = kTRUE; for (Int_t iDet = kRef; iDet < kNofSystems; iDet++) { if ( GetSize(iDet) ) { if ( firstDetector ) { time = GetFirstTime(iDet); firstDetector = kFALSE; } //? first detector with data else time = ( time < GetFirstTime(iDet) ? time : GetFirstTime(iDet) ); } //? detector has data } //# detectors return time; } // --------------------------------------------------------------------------- // ----- Time of first raw data for detector ------------------------------ Double_t CbmDaqBuffer::GetFirstTime(Int_t iDet) const { if ( iDet < kRef || iDet >= kNofSystems ) return -1.; if ( ! GetSize(iDet) ) return -1.; assert ( (fData[iDet].begin())->second.first ); return (fData[iDet].begin())->second.first->GetTime(); } // --------------------------------------------------------------------------- // ----- Time of last raw data ------------------------------------------- Double_t CbmDaqBuffer::GetLastTime() const { Double_t time = -1.; Bool_t firstDetector = kTRUE; for (Int_t iDet = kRef; iDet < kNofSystems; iDet++) { if ( GetSize(iDet) ) { if ( firstDetector ) { time = GetLastTime(iDet); firstDetector = kFALSE; } //? first detector else time = ( time > GetLastTime(iDet) ? time : GetLastTime(iDet) ); } //? detector has data } //# detectors return time; } // --------------------------------------------------------------------------- // ----- Time of last raw data for detector ------------------------------- Double_t CbmDaqBuffer::GetLastTime(Int_t iDet) const { if ( iDet < kRef || iDet >= kNofSystems ) return -1.; if ( ! GetSize(iDet) ) return -1.; assert ( (--fData[iDet].end())->second.first ); return (--fData[iDet].end())->second.first->GetTime(); } // --------------------------------------------------------------------------- // ----- Access to next data --------------------------------------------- CbmDaqBuffer::Data CbmDaqBuffer::GetNextData(Int_t iDet) { assert( iDet < kNofSystems); Data value(nullptr, nullptr); if ( ! fData[iDet].empty() ) { //? Buffer not empty auto firstData = fData[iDet].begin(); value.first = std::move(firstData->second.first); // digi value.second = std::move(firstData->second.second); // match fData[iDet].erase(firstData); } //? Buffer not empty return value; } // --------------------------------------------------------------------------- // ----- Access to next data with time limit ------------------------------ CbmDaqBuffer::Data CbmDaqBuffer::GetNextData(Int_t iDet, Double_t time) { assert( iDet < kNofSystems); Data value(nullptr, nullptr); if ( ! fData[iDet].empty() ) { //? Buffer not empty auto firstData = fData[iDet].begin(); if ( firstData->first < time ) { //? Time before limit value.first = std::move(firstData->second.first); value.second = std::move(firstData->second.second); fData[iDet].erase(firstData); } //? Time before time limit } //? Buffer not empty return value; } // --------------------------------------------------------------------------- // ----- Number of objects in buffer ------------------------------------- Int_t CbmDaqBuffer::GetSize() const { Int_t size = 0; for (Int_t iDet = kRef; iDet < kNofSystems; iDet++) size += fData[iDet].size(); return size; } // --------------------------------------------------------------------------- // ----- Number of objects in buffer for given detector ------------------ Int_t CbmDaqBuffer::GetSize(Int_t det) const { if ( det < kRef || det > kNofSystems) return 0; return fData[det].size(); } // --------------------------------------------------------------------------- // ----- Insert data into buffer ----------------------------------------- void CbmDaqBuffer::InsertData(up_CbmDigi digi, up_CbmMatch match) { assert(digi); Int_t iDet = digi->GetSystemId(); assert ( iDet < kNofSystems ); Double_t time = digi->GetTime(); fData[iDet].insert(make_pair(time, make_pair(move(digi), move(match)))); } // --------------------------------------------------------------------------- // ----- Insert digi into buffer ----------------------------------------- void CbmDaqBuffer::InsertDigi(CbmDigi* digi) { assert(digi); Int_t iDet = digi->GetSystemId(); assert ( iDet < kNofSystems ); Double_t time = digi->GetTime(); LOG(debug2) << "DaqBuffer: Inserting digi, system " << iDet << ", detectorID " << digi->GetAddress() << ", time " << time; up_CbmDigi digi_p = nullptr; digi_p.reset(digi); up_CbmMatch match_p = nullptr; fData[iDet].insert(make_pair(time, make_pair(move(digi_p), move(match_p)))); } // --------------------------------------------------------------------------- // ----- Print status ---------------------------------------------------- void CbmDaqBuffer::PrintStatus() const { TString sysName; Int_t size = GetSize(); std::stringstream ss; ss << "DaqBuffer: Status "; if ( ! size ) { LOG(info) << ss.str() << "empty"; return; } for (Int_t det = kRef; det < kNofSystems; det++) { if ( GetSize(det) ) { sysName = CbmModuleList::GetModuleNameCaps(det); ss << sysName << " " << GetSize(det) << " "; } } ss << "\t " << "Total: " << GetSize() << " from " << fixed << setprecision(3) << GetFirstTime() << " ns to " << GetLastTime() << " ns"; LOG(info) << ss.str(); } // --------------------------------------------------------------------------- // ----- Status to string ------------------------------------------------ string CbmDaqBuffer::ToString() const { stringstream ss; ss << "DaqBuffer: "; Int_t size = GetSize(); if ( ! size ) { ss << "empty"; return ss.str(); } TString sysName; for (Int_t det = kRef; det < kNofSystems; det++) { if ( GetSize(det) ) { sysName = CbmModuleList::GetModuleNameCaps(det); ss << sysName << " " << GetSize(det) << " "; } } ss << "Total: " << size << " from " << fixed << setprecision(3) << GetFirstTime() << " ns to " << GetLastTime() << " ns"; return ss.str(); } // ---------------------------------------------------------------------------