diff --git a/MQ/mcbm/CbmDeviceDigiEventSink.cxx b/MQ/mcbm/CbmDeviceDigiEventSink.cxx index c3306319149ec0b1a1d942f037bfa1556f477e06..239d6daa69baaa9b11184b13e0a2d121937c0752 100644 --- a/MQ/mcbm/CbmDeviceDigiEventSink.cxx +++ b/MQ/mcbm/CbmDeviceDigiEventSink.cxx @@ -270,7 +270,8 @@ bool CbmDeviceDigiEventSink::HandleData(FairMQParts& parts, int /*index*/) CbmEventTimeslice unpTs(parts); /// FIXME: Need to check if TS arrived in order (probably not!!!) + buffer!!! - LOG(debug) << "Next TS check " << fuPrevTsIndex << " " << fulTsCounter << " " << unpTs.fTsMetaData.GetIndex(); + LOG(info) << "Next TS check " << fuPrevTsIndex << " " << fulTsCounter << " " << unpTs.fTsMetaData.GetIndex() + << " Sorage size: " << fmFullTsStorage.size(); if (fuPrevTsIndex + 1 == unpTs.fTsMetaData.GetIndex() || (0 == fuPrevTsIndex && 0 == fulTsCounter && 0 == unpTs.fTsMetaData.GetIndex())) { LOG(debug) << "TS direct to dump"; @@ -764,62 +765,185 @@ std::vector<CbmDigiEvent> CbmEventTimeslice::GetSelectedData() selEvent.fTime = event.GetStartTime(); selEvent.fNumber = event.GetNumber(); + /// FIXME: for pure digi based event, we select "continuous slices of digis" + /// => Copy block of [First Digi index, last digi index] with assign(it_start, it_stop) + /// FIXME: Keep TRD1D + TRD2D support, may lead to holes in the digi sequence! + /// => Would need to keep the loop + + /// Get the proper order for block selection as TRD1D and TRD2D may insert indices in separate loops + /// => Needed to ensure that the start and stop of the block copy do not trigger a vector size exception + event.SortIndices(); + /// for each detector, find the data in the Digi vectors and copy them /// TODO: Template + loop on list of data types? /// ==> T0 uint32_t uNbDigis = (0 < event.GetNofData(ECbmDataType::kT0Digi) ? event.GetNofData(ECbmDataType::kT0Digi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fT0.fDigis.push_back(fvDigiT0[event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx)]); + auto startIt = fvDigiT0.begin() + event.GetIndex(ECbmDataType::kT0Digi, 0); + auto stopIt = fvDigiT0.begin() + event.GetIndex(ECbmDataType::kT0Digi, uNbDigis - 1); + selEvent.fData.fT0.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kT0Digi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fT0.fDigis.push_back(fvDigiT0[event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx) - (uPrevIdx + 1); + } + uPrevIdx = event.GetIndex(ECbmDataType::kT0Digi, uDigiIdx); + } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the T0 block selection added " << uNbExtra + << " extra digis compared to the loop one"; } + */ } /// ==> STS uNbDigis = (0 < event.GetNofData(ECbmDataType::kStsDigi) ? event.GetNofData(ECbmDataType::kStsDigi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fSts.fDigis.push_back(fvDigiSts[event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx)]); + auto startIt = fvDigiSts.begin() + event.GetIndex(ECbmDataType::kStsDigi, 0); + auto stopIt = fvDigiSts.begin() + event.GetIndex(ECbmDataType::kStsDigi, uNbDigis - 1); + selEvent.fData.fSts.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kStsDigi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fSts.fDigis.push_back(fvDigiSts[event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx) - (uPrevIdx + 1); + } + uPrevIdx = event.GetIndex(ECbmDataType::kStsDigi, uDigiIdx); } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the STS block selection added " << uNbExtra + << " extra digis compared to the loop one"; + } + */ } /// ==> MUCH uNbDigis = (0 < event.GetNofData(ECbmDataType::kMuchDigi) ? event.GetNofData(ECbmDataType::kMuchDigi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fMuch.fDigis.push_back(fvDigiMuch[event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx)]); + auto startIt = fvDigiMuch.begin() + event.GetIndex(ECbmDataType::kMuchDigi, 0); + auto stopIt = fvDigiMuch.begin() + event.GetIndex(ECbmDataType::kMuchDigi, uNbDigis - 1); + selEvent.fData.fMuch.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kMuchDigi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fMuch.fDigis.push_back(fvDigiMuch[event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx) - (uPrevIdx + 1); + } + uPrevIdx = event.GetIndex(ECbmDataType::kMuchDigi, uDigiIdx); + } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the MUCH block selection added " << uNbExtra + << " extra digis compared to the loop one"; } + */ } - /// ==> TRD + /// ==> TRD + TRD2D uNbDigis = (0 < event.GetNofData(ECbmDataType::kTrdDigi) ? event.GetNofData(ECbmDataType::kTrdDigi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fTrd.fDigis.push_back(fvDigiTrd[event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)]); + auto startIt = fvDigiTrd.begin() + event.GetIndex(ECbmDataType::kTrdDigi, 0); + auto stopIt = fvDigiTrd.begin() + event.GetIndex(ECbmDataType::kTrdDigi, uNbDigis - 1); + selEvent.fData.fTrd.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kTrdDigi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fTrd.fDigis.push_back(fvDigiTrd[event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx) - (uPrevIdx + 1); + LOG(info) << "Extra TRD digi: prev is " << uPrevIdx << " vs new " << event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx) + << " index " << uDigiIdx << " out of " << uNbDigis; + } + uPrevIdx = event.GetIndex(ECbmDataType::kTrdDigi, uDigiIdx); } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the TRD block selection added " << uNbExtra + << " extra digis compared to the loop one"; + } + */ } /// ==> TOF uNbDigis = (0 < event.GetNofData(ECbmDataType::kTofDigi) ? event.GetNofData(ECbmDataType::kTofDigi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fTof.fDigis.push_back(fvDigiTof[event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx)]); + auto startIt = fvDigiTof.begin() + event.GetIndex(ECbmDataType::kTofDigi, 0); + auto stopIt = fvDigiTof.begin() + event.GetIndex(ECbmDataType::kTofDigi, uNbDigis - 1); + selEvent.fData.fTof.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kTofDigi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fTof.fDigis.push_back(fvDigiTof[event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx) - (uPrevIdx + 1); + } + uPrevIdx = event.GetIndex(ECbmDataType::kTofDigi, uDigiIdx); + } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the TOF block selection added " << uNbExtra + << " extra digis compared to the loop one"; } + */ } /// ==> RICH uNbDigis = (0 < event.GetNofData(ECbmDataType::kRichDigi) ? event.GetNofData(ECbmDataType::kRichDigi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fRich.fDigis.push_back(fvDigiRich[event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx)]); + auto startIt = fvDigiRich.begin() + event.GetIndex(ECbmDataType::kRichDigi, 0); + auto stopIt = fvDigiRich.begin() + event.GetIndex(ECbmDataType::kRichDigi, uNbDigis - 1); + selEvent.fData.fRich.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kRichDigi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fRich.fDigis.push_back(fvDigiRich[event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx) - (uPrevIdx + 1); + } + uPrevIdx = event.GetIndex(ECbmDataType::kRichDigi, uDigiIdx); } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the RICH block selection added " << uNbExtra + << " extra digis compared to the loop one"; + } + */ } /// ==> PSD uNbDigis = (0 < event.GetNofData(ECbmDataType::kPsdDigi) ? event.GetNofData(ECbmDataType::kPsdDigi) : 0); if (uNbDigis) { - for (uint32_t uDigiIdx = 0; uDigiIdx < uNbDigis; ++uDigiIdx) { - selEvent.fData.fPsd.fDigis.push_back(fvDigiPsd[event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx)]); + auto startIt = fvDigiPsd.begin() + event.GetIndex(ECbmDataType::kPsdDigi, 0); + auto stopIt = fvDigiPsd.begin() + event.GetIndex(ECbmDataType::kPsdDigi, uNbDigis - 1); + selEvent.fData.fPsd.fDigis.assign(startIt, stopIt); + + /* + uint32_t uPrevIdx = event.GetIndex(ECbmDataType::kPsdDigi, 0); + uint32_t uNbExtra = 0; + for (uint32_t uDigiIdx = 1; uDigiIdx < uNbDigis; ++uDigiIdx) { + // selEvent.fData.fPsd.fDigis.push_back(fvDigiPsd[event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx)]); + if (uPrevIdx + 1 != event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx)) { + uNbExtra += event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx) - (uPrevIdx + 1); + } + uPrevIdx = event.GetIndex(ECbmDataType::kPsdDigi, uDigiIdx); + } + if (0 < uNbExtra) { + LOG(info) << "In event " << event.GetNumber() << " the PSD block selection added " << uNbExtra + << " extra digis compared to the loop one"; } + */ } vEventsSel.push_back(selEvent); diff --git a/core/data/CbmEvent.cxx b/core/data/CbmEvent.cxx index 84321c41e21cf53ab99f2989ec0eb83a53402a91..de4c99c2c3a634fd5e2897e8665e340572725f92 100644 --- a/core/data/CbmEvent.cxx +++ b/core/data/CbmEvent.cxx @@ -9,6 +9,7 @@ **/ #include "CbmEvent.h" +#include <algorithm> // for std::sort #include <iostream> // for operator<<, basic_ostream #include <sstream> // for stringstream #include <string> // for char_traits @@ -95,5 +96,13 @@ std::string CbmEvent::ToString() const } // ------------------------------------------------------------------------- +// ------------------------------------------------------------------------- +void CbmEvent::SortIndices() +{ + for (auto it = fIndexMap.begin(); it != fIndexMap.end(); it++) { + std::sort(it->second.begin(), it->second.end()); + } +} +// ------------------------------------------------------------------------- ClassImp(CbmEvent) diff --git a/core/data/CbmEvent.h b/core/data/CbmEvent.h index 67e6785431af23058c95c511ae358a3878dcf6c4..c9032922b82e9b4116298fa8f5c3d8accea25cc2 100644 --- a/core/data/CbmEvent.h +++ b/core/data/CbmEvent.h @@ -38,10 +38,10 @@ public: CbmEvent() : CbmEvent(-1, 0., 0.) {}; /** Constructor with event number and time - ** @param[in] number Event number - ** @param[in] startTime Event start time [ns] - ** @param[in] endTime Event start time [ns] - **/ + ** @param[in] number Event number + ** @param[in] startTime Event start time [ns] + ** @param[in] endTime Event start time [ns] + **/ CbmEvent(int32_t number, double startTime = 0., double endTime = 0.) : TObject() , fNumber(number) @@ -69,29 +69,29 @@ public: /** Add a data object to the index map - ** @param DataType Type of data (for values see CbmDetectorList.h) - ** @param Index Index of the data object in its TClonesArray - */ + ** @param DataType Type of data (for values see CbmDetectorList.h) + ** @param Index Index of the data object in its TClonesArray + */ void AddData(ECbmDataType type, uint32_t index); /** Add an STS track to the event - ** @param Index of STS track in its TClonesArray - **/ + ** @param Index of STS track in its TClonesArray + **/ void AddStsTrack(uint32_t index) { AddData(ECbmDataType::kStsTrack, index); } /** Get the index of a data object in its TClonesArray - ** @param DataType Type of data (for values see CbmDetectorList.h) - ** @param iData Running number of data object in event - ** @value Index of data object in its TClonesArray - **/ + ** @param DataType Type of data (for values see CbmDetectorList.h) + ** @param iData Running number of data object in event + ** @value Index of data object in its TClonesArray + **/ uint32_t GetIndex(ECbmDataType type, uint32_t iData); /** Get match object - ** @value Pointer to match object - **/ + ** @value Pointer to match object + **/ CbmMatch* GetMatch() const { return fMatch; } @@ -100,71 +100,71 @@ public: /** Get number of data objects of a given type in this event - ** @param DataType Type of data (for values see CbmDetectorList.h) - ** @value Number of objects of type DataType in the event. - ** -1 is data type is not registered. - **/ + ** @param DataType Type of data (for values see CbmDetectorList.h) + ** @value Number of objects of type DataType in the event. + ** -1 is data type is not registered. + **/ int32_t GetNofData(ECbmDataType type) const; /** Get number of STS tracks - ** @value Number of STS tracks in the event. -1 if not registered. - **/ + ** @value Number of STS tracks in the event. -1 if not registered. + **/ int32_t GetNofStsTracks() const { return GetNofData(ECbmDataType::kStsTrack); } /** Get event number - ** @value Event number - **/ + ** @value Event number + **/ int32_t GetNumber() const { return fNumber; } /** Get STS track index - ** @param iTrack Running number of STS track in the event - ** @value index Index of STS track in TClonesArray - **/ + ** @param iTrack Running number of STS track in the event + ** @value index Index of STS track in TClonesArray + **/ int32_t GetStsTrackIndex(int32_t iTrack) { return GetIndex(ECbmDataType::kStsTrack, iTrack); } /** Get event end time - ** @value End time of event [ns] - **/ + ** @value End time of event [ns] + **/ double GetEndTime() const { return fTimeEnd; } /** Get event start time - ** @value Start time of event [ns] - **/ + ** @value Start time of event [ns] + **/ double GetStartTime() const { return fTimeStart; } /** Set event number - ** @value Event number - **/ + ** @value Event number + **/ void SetNumber(int32_t number) { fNumber = number; } /** Set end time - ** @param endTime End time of event [ns] - **/ + ** @param endTime End time of event [ns] + **/ void SetEndTime(double endTime) { fTimeEnd = endTime; } /** Set a match object - ** @param match Pointer to a match object - **/ + ** @param match Pointer to a match object + **/ void SetMatch(CbmMatch* match) { fMatch = match; } /** Set start time - ** @param endTime Start time of event [ns] - **/ + ** @param endTime Start time of event [ns] + **/ void SetStartTime(double startTime) { fTimeStart = startTime; } /** Set the STS track index array - ** @brief Sets the index array for STS tracks. - ** Old content will be overwritten. - ** @param indexVector Vector with indices of STS tracks - **/ + ** @brief Sets the index array for STS tracks. + ** Old content will be overwritten. + ** @param indexVector Vector with indices of STS tracks + **/ void SetStsTracks(std::vector<uint32_t>& indexVector) { fNofData -= fIndexMap[ECbmDataType::kStsTrack].size(); @@ -174,24 +174,29 @@ public: /** Set the event vertex variables - *@param x x coordinate [cm] - *@param y y coordinate [cm] - *@param z z coordinate [cm] - *@param chi2 chi square of vertex fit - *@param ndf Number of degrees of freedom of vertex fit - *@param nTracks Number of tracks used for vertex fit - *@param covMat Covariance Matrix (symmetric, 3x3) - **/ + ** @param x x coordinate [cm] + ** @param y y coordinate [cm] + ** @param z z coordinate [cm] + ** @param chi2 chi square of vertex fit + ** @param ndf Number of degrees of freedom of vertex fit + ** @param nTracks Number of tracks used for vertex fit + ** @param covMat Covariance Matrix (symmetric, 3x3) + **/ void SetVertex(double x, double y, double z, double chi2, int32_t ndf, int32_t nTracks, const TMatrixFSym& covMat); + /** Sort the indices from smallest to biffest for each data type + **/ + void SortIndices(); + + /** String output **/ std::string ToString() const; /** Get event vertex - ** @value Pointer to vertex object - **/ + ** @value Pointer to vertex object + **/ CbmVertex* GetVertex() { return &fVertex; } /** Swap two events **/