diff --git a/reco/base/CbmUnpack.h b/reco/base/CbmUnpack.h index 05d6b1b7dae2435cc1bfbd7282eb0bc13c03c7b2..837210f022cc491884bd9af13149aa601cea55c9 100644 --- a/reco/base/CbmUnpack.h +++ b/reco/base/CbmUnpack.h @@ -8,12 +8,18 @@ #ifndef CBMUNPACK_H #define CBMUNPACK_H +/// CbmRoot (+externals) headers #include "Timeslice.hpp" +#include "CbmErrorMessage.h" +/// FairRoot headers + +/// Fairsoft (Root, Boost, ...) headers #include "Rtypes.h" #include <boost/any.hpp> +/// C/C++ headers #include <vector> #include <string> #include <map> @@ -50,6 +56,7 @@ class CbmUnpack fdTsFullSizeInNs(-1.0), fvpAllHistoPointers(), fDigiVect(), + fErrVect(), fParameterMap() {}; virtual ~CbmUnpack() = default; @@ -79,7 +86,8 @@ class CbmUnpack std::vector< std::pair< TCanvas *, std::string > > GetCanvasVector() { return fvpAllCanvasPointers; } /// Output vector - void AssignOutputVector( std::vector<T> & rVect ){ fDigiVect = rVect; } + void AssignOutputVector( std::vector< T > & rVect ){ fDigiVect = rVect; } + void AssignErrorVector( std::vector< CbmErrorMessage > & rVect ){ fErrVect = rVect; } // void ClearVector() {fDigiVect->clear();} // std::vector<T> * GetVector() {return fDigiVect;} @@ -116,6 +124,7 @@ class CbmUnpack /// Output vector std::vector<T> & fDigiVect; //! Vector of digis FIXME: check that the reference works as expected + std::vector< CbmErrorMessage > & fErrVect = {}; //! Vector of error messages /// For any algo std::map<std::string, std::string> fParameterMap; //! Map of parameter name and type diff --git a/reco/base/CbmUnpackTask.h b/reco/base/CbmUnpackTask.h index 7650c6e6550751524b516d26c1e7a4cddca007c6..379075ffd8c49a9c3a22457e4b6adc5e6acd53e1 100644 --- a/reco/base/CbmUnpackTask.h +++ b/reco/base/CbmUnpackTask.h @@ -66,7 +66,8 @@ class CbmUnpackTask : public CbmUnpackTaskBase uint64_t fulTsCounter = 0; //! TS counter, not same as TS index! /// Input/Output vector - std::vector< TDigi > * fvDigiIO = nullptr; //! IO vector of Digis, passed to algo for filling and propagated to framework for outpu + std::vector< TDigi > * fvDigiIO = nullptr; //! IO vector of Digis, passed to algo for filling and propagated to framework for output + std::vector< CbmErrorMessage > * fvErrorIO = nullptr; //! IO vector of Errors, passed to algo for filling and propagated to framework for output /// Histograms for vector monitoring? // TH1* fhArraySize = nullptr; diff --git a/reco/base/CbmUnpackTask.tmpl b/reco/base/CbmUnpackTask.tmpl index 839ebb7fc322f5e03f5bc9802a9db56cf9c5cb5c..08fddecc6ccb849e9804f893daf0d63de8b1f58a 100644 --- a/reco/base/CbmUnpackTask.tmpl +++ b/reco/base/CbmUnpackTask.tmpl @@ -36,7 +36,8 @@ CbmUnpackTask< TDigi, TAlgo, TParam >::CbmUnpackTask( TString sDigiBranchName, T fsDigiBranchName( sDigiBranchName ), fsDigiBranchDescr( sDigiBranchDescr ) { - fvDigiIO = new std::vector< TDigi >(); +// fvDigiIO = new std::vector< TDigi >(); +// fvErrorIO = new std::vector< CbmErrorMessage >(); fUnpackerAlgo = new TAlgo(); } @@ -49,6 +50,11 @@ CbmUnpackTask< TDigi, TAlgo, TParam >::~CbmUnpackTask() { fvDigiIO.clear(); delete fvDigiIO; + }; + if( nullptr != fvErrorIO ) + { + fvErrorIO.clear(); + delete fvErrorIO; } } @@ -82,6 +88,24 @@ Bool_t CbmUnpackTask< TDigi, TAlgo, TParam >::Init() fvDigiIO, fbWriteOutput); } // if( nullptr == fvDigiIO ) else LOG(info) << "--> Found existing IO vector, re-using it."; + fUnpackerAlgo->AssignOutputVector( fvDigiIO ); + + /// Check first if array not already existing due to other unpacker! + fvErrorIO = static_cast< std::vector< TDigi > *>(ioman->GetObject( "ErrorMessage" )); + if( nullptr == fvErrorIO ) + { + /// No existing array => create it! + fvErrorIO = new std::vector< CbmErrorMessage >(); + if( nullptr == fvErrorIO ) + { + LOG(fatal) << "Failed creating the IO vector for error messages"; + } // if( nullptr == fvErrorIO ) + ioman->RegisterAny( "ErrorMessage", +// ( "" == fsDigiBranchDescr ? fsDigiBranchName : fsDigiBranchDescr), + fvErrorIO, fbWriteOutput); + } // if( nullptr == fvErrorIO ) + else LOG(info) << "--> Found existing IO vector for error messages, re-using it."; + fUnpackerAlgo->AssignErrorVector( fvErrorIO ); return kTRUE; } @@ -169,6 +193,27 @@ template< class TDigi, class TAlgo, class TParam > void CbmUnpackTask< TDigi, TAlgo, TParam >::Reset() { fvDigiIO->clear(); + fvErrorIO->clear(); +} + +template< class TDigi, class TAlgo, class TParam > +Bool_t CbmUnpackTask< TDigi, TAlgo, TParam >::DoUnpack(const fles::Timeslice& ts, size_t /*component*/) +{ + if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) ) + { + LOG(error) << "Failed processing TS " << ts.index() + << " in unpacker algorithm class"; + return kTRUE; + } // if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) ) + + if( 0 == ts.index() % 10000 ) + LOG(info) << "Processed TS with index " << std::setw( 9 ) << fulTsCounter; + + if( 0 == fulTsCounter % 10000 ) + LOG(info) << "Processed " << std::setw( 9 ) << fulTsCounter << " TS "; + fulTsCounter++; + + return kTRUE; } template< class TDigi, class TAlgo, class TParam >