Commit ff3ccc64 authored by Pascal Raisig's avatar Pascal Raisig Committed by Pierre-Alain Loizeau
Browse files

Add a first version of the Sts algorithm

Unfortunately this does not yet produce digis, but I am note sure, if it is an parameter based issue or an issue with the implementation. I think it needs some experts from the Sts to have a look. Which is why I am pushing it.
parent 63ebe519
......@@ -89,6 +89,14 @@ void run_unpack_tsa(std::string infile = "test.tsa", UInt_t runid = 0, const cha
richconfig->SetParFilesBasePath(parfilesbasepathRich);
// -------------
// ---- STS ----
auto stsconfig = std::make_shared<CbmStsUnpackConfig>("", runid);
// stsconfig->SetDebugState();
stsconfig->SetDoWriteOutput();
std::string parfilesbasepathSts = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data());
stsconfig->SetParFilesBasePath(parfilesbasepathRich);
// -------------
// ---- TRD ----
TString trdsetuptag = "";
cbmsetup->GetGeoTag(ECbmModuleId::kTrd, trdsetuptag);
......@@ -96,6 +104,8 @@ void run_unpack_tsa(std::string infile = "test.tsa", UInt_t runid = 0, const cha
auto trdconfig = std::make_shared<CbmTrdUnpackConfig>(trdsetuptag.Data(), 3);
// trdconfig->SetDebugState();
trdconfig->SetDoWriteOutput();
// Activate the line below to write Trd1D digis to a separate "TrdSpadicDigi" branch. Can be used to separate between Fasp and Spadic digis
// trdconfig->SetOutputBranchName("TrdSpadicDigi");
// trdconfig->SetDoWriteOptOutA(CbmTrdRawMessageSpadic::GetBranchName());
// trdconfig->SetDoWriteOptOutB("SpadicInfoMessages"); // SpadicInfoMessages
......@@ -110,7 +120,8 @@ void run_unpack_tsa(std::string infile = "test.tsa", UInt_t runid = 0, const cha
auto trdfasp2dconfig = std::make_shared<CbmTrdUnpackConfigFasp2D>("", runid);
// trdfasp2dconfig->SetDebugState();
trdfasp2dconfig->SetDoWriteOutput();
trdfasp2dconfig->SetOutputBranchName("FaspTrdDigi");
// Activate the line below to write Trd1D digis to a separate "TrdFaspDigi" branch. Can be used to separate between Fasp and Spadic digis
// trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi");
std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
// -------------
......@@ -131,7 +142,8 @@ void run_unpack_tsa(std::string infile = "test.tsa", UInt_t runid = 0, const cha
auto source = new CbmSourceTsArchive(infile.data());
auto unpack = source->GetRecoUnpack();
unpack->SetUnpackConfig(psdconfig);
unpack->SetUnpackConfig(richconfig);
// unpack->SetUnpackConfig(richconfig); // Problematic in 1588
unpack->SetUnpackConfig(stsconfig);
unpack->SetUnpackConfig(trdconfig);
unpack->SetUnpackConfig(trdfasp2dconfig);
// ------------------------------------------------------------------------
......
......@@ -135,6 +135,9 @@ protected:
/** @brief Start time of the current TS [ns] */
size_t fTsStartTime = 0;
/** @brief Index of the current TS */
size_t fTsIndex = 0;
/** @brief Additional explicit finish function of the derived algo implementations. */
virtual void finish() = 0;
......@@ -259,7 +262,7 @@ public:
LOG(info) << fName << "::Finish. \n Number of CrcValidFlags " << fNrCrcValidFlags
<< " \n Number of OverflowFlimFlags " << fNrOverflowFlimFlags << " \n Number of OverflowUserFlags "
<< fNrOverflowUserFlags << " \n Number of DataErrorFlags " << fNrDataErrorFlags;
<< fNrOverflowUserFlags << " \n Number of DataErrorFlags " << fNrDataErrorFlags << "\n";
// Additional explicit finish of the derived class used during runtime.
finish();
......@@ -367,9 +370,10 @@ public:
if (fIsFirstTs) getTimesliceParams(ts);
// Get the index of the current timeslice
auto currTsIdx = ts->index();
fTsIndex = ts->index();
// Get the number of the current timeslice (the index increases currently via nthTimeslice* fNrCoreMsPerTs)
size_t itimeslice = currTsIdx / fNrCoreMsPerTs;
size_t itimeslice = fTsIndex / fNrCoreMsPerTs;
// Set further parameters required by the explicit algorithm
setDerivedTsParameters(itimeslice);
......@@ -385,8 +389,8 @@ public:
}
}
fNrCreatedDigis += fOutputVec.size();
// Sort the optional output vectors according to the time. (Digi vector is handled by CbmRecoUnpack)
++fNrProcessedTs;
return fOutputVec;
}
......
......@@ -4,12 +4,13 @@ set(INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/core/detectors/psd
${CBMBASE_DIR}
${CBMDATA_DIR}
${CBMDATA_DIR}/global
${CBMDATA_DIR}/base
${CBMDATA_DIR}/global
${CBMDATA_DIR}/psd
${CBMDATA_DIR}/raw
${CBMBASE_DIR}
${CBMROOT_SOURCE_DIR}/reco/base
......
......@@ -67,7 +67,7 @@ Bool_t CbmPsdUnpackAlgo::initParSet(FairParGenericSet* parset)
return kFALSE;
}
// ---- initParSet(CbmTrdParSetAsic* parset) ----
// ---- initParSet(CbmMcbm2018PsdPar* parset) ----
Bool_t CbmPsdUnpackAlgo::initParSet(CbmMcbm2018PsdPar* parset)
{
LOG(debug) << fName << "::initParSetAsic - ";
......@@ -114,12 +114,6 @@ Bool_t CbmPsdUnpackAlgo::initParSet(CbmMcbm2018PsdPar* parset)
for (size_t ichannel = 0; ichannel < fviPsdChUId.size(); ++ichannel) {
fMipCalibration.emplace_back(parset->GetMipCalibration(ichannel));
}
return kTRUE;
LOG(info) << fName << "::initParSetPsdMcbm2018 - Successfully initialized Spadic hardware address map";
return kTRUE;
}
......
......@@ -22,6 +22,7 @@ CbmStsTrackFinderIdeal.cxx
unpack/CbmStsUnpackAlgo.cxx
unpack/CbmStsUnpackConfig.cxx
unpack/CbmStsUnpackMonitor.cxx
)
# ----- End of sources ---------------------------------
......@@ -37,6 +38,10 @@ ${CBMROOT_SOURCE_DIR}/reco/detectors/sts/unpack
# Reco
${CBMROOT_SOURCE_DIR}/reco/base
#QA
${CBMROOT_SOURCE_DIR}/qa
${CBMROOT_SOURCE_DIR}/core/qa
# Base
${CBMBASE_DIR}
......@@ -45,6 +50,7 @@ ${CBMDATA_DIR}
${CBMDATA_DIR}/base
${CBMDATA_DIR}/global
${CBMDATA_DIR}/sts
${CBMDATA_DIR}/raw
${CBMDATA_DIR}/mvd
# MVD
......@@ -72,7 +78,7 @@ ${Boost_LIBRARY_DIRS}
# ----- Specify library dependences -------------------
Set(DEPENDENCIES
CbmBase CbmData CbmRecoBase CbmStsBase
CbmBase CbmData CbmQaBase CbmRecoBase CbmStsBase
)
# ---------------------------------------------------------
......
......@@ -21,5 +21,6 @@
#pragma link C++ class CbmStsUnpackAlgo + ;
#pragma link C++ class CbmStsUnpackConfig + ;
#pragma link C++ class CbmStsUnpackMonitor + ;
#endif /* __CINT__ */
......@@ -21,8 +21,11 @@
#ifndef CbmStsUnpackAlgo_H
#define CbmStsUnpackAlgo_H
#include "CbmErrorMessage.h" // REMARK see remark in CbmStsUnpackConfig
#include "CbmMcbm2018StsPar.h"
#include "CbmRecoUnpackAlgo.tmpl"
#include "CbmStsDigi.h"
#include "CbmStsUnpackMonitor.h"
#include "Timeslice.hpp" // timeslice
......@@ -34,7 +37,7 @@
#include <memory>
#include <utility>
class CbmStsUnpackAlgo : public CbmRecoUnpackAlgo<CbmStsDigi> {
class CbmStsUnpackAlgo : public CbmRecoUnpackAlgo<CbmStsDigi, CbmErrorMessage> {
public:
/** @brief Create the Cbm Trd Unpack AlgoBase object */
CbmStsUnpackAlgo();
......@@ -58,29 +61,67 @@ public:
* @return fParContVec
*/
virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
GetParContainerRequest(std::string geoTag, std::uint32_t runId)
{
return {};
};
GetParContainerRequest(std::string geoTag, std::uint32_t runId);
/**
* @brief Mask a Noisy Channel
*
* @param uFeb
* @param uChan
* @param bMasked
*/
void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
/** @brief Set the minimum adc cut value @param[in] value */
void SetMinAdcCut(uint32_t value) { fdAdcCut = value; }
/** @brief Set the minimum adc cut value @param[in] value */
void SetAsicTimeOffsetVec(std::vector<double> value) { fvdTimeOffsetNsAsics.swap(value); }
/** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> monitor) { fMonitor = monitor; }
protected:
// /** @brief Add the sts-xyter-hits to the output buffer as Digis */
// void AddHitsToDigiVect(std::vector<stsxyter::FinalHit>* vmHitsIn, std::vector<CbmStsDigi>* vDigiVectOut);
/** @brief Finish function for this algorithm base clase */
void finish()
{
finishDerived();
// Finish the monitor if we have one
// if (fMonitor) fMonitor->Finish();
return;
}
/** @brief Function that allows special calls during Finish in the derived algos */
virtual void finishDerived() { return; }
/**
* @brief Get the Asic Index
*
* @param dpbidx
* @param crobidx
* @param elinkidx
*/
uint32_t getAsicIndex(uint32_t dpbidx, uint32_t crobidx, uint16_t elinkidx);
/**
* @brief Get the Full Time Stamp from raw time stamp
*
* @param usRawTs
* @return uint64_t
*/
uint64_t getFullTimeStamp(const uint16_t usRawTs);
/**
* @brief Intialisation at begin of run. Special inits of the derived algos.
*
* @retval Bool_t initOk
*/
Bool_t init() { return kTRUE; }
Bool_t init();
/** @brief Initialize the DpbIdIndexMap with the information from the parset @param[in] parset parameter set for the Sts unpacker */
void initDpbIdIndexMap(CbmMcbm2018StsPar* parset);
/** @brief experts please add description here */
void initInternalStatus(CbmMcbm2018StsPar* parset);
/**
* @brief Handles the distribution of the hidden derived classes to their explicit functions.
......@@ -88,7 +129,60 @@ protected:
* @param parset
* @return Bool_t initOk
*/
Bool_t initParSet(FairParGenericSet* parset) { return kTRUE; }
Bool_t initParSet(FairParGenericSet* parset);
/**
* @brief Initialize the parameters from CbmMcbm2018StsPar.
*
* @param parset
* @return Bool_t initOk
*/
Bool_t initParSet(CbmMcbm2018StsPar* parset);
/** @brief Initialize and transfer the informations to the parameters storage vectors */
void initTempVectors(CbmMcbm2018StsPar* parset, std::vector<int32_t>* viModuleType,
std::vector<int32_t>* viModAddress,
std::vector<std::vector<std::vector<int32_t>>>* viFebModuleIdx,
std::vector<std::vector<bool>>* vbCrobActiveFlag,
std::vector<std::vector<std::vector<int32_t>>>* viFebModuleSide);
/**
* @brief Main loop over the sts xyter messages in the µSlices
*
* @param msContent
* @param uSize
* @param uMsIdx
* @param bError
* @param sMessPatt
* @param vNbMessType
*/
void loopMsMessages(const uint8_t* msContent, const uint32_t uSize, const size_t uMsIdx, bool& bError,
std::string& sMessPatt, std::vector<uint32_t>& vNbMessType);
/** @brief experts please add description */
void printActiveCrobs(CbmMcbm2018StsPar* parset, const std::vector<std::vector<bool>>& vbCrobActiveFlag);
/** @brief experts please add description */
void printAddressMaps(CbmMcbm2018StsPar* parset, const std::vector<std::vector<std::vector<int32_t>>>& viFebModuleIdx,
const std::vector<std::vector<std::vector<int32_t>>>& viFebModuleSide);
/** @brief experts please add description marked as not used currently*/
void processEpochInfo(const stsxyter::Message& /*mess*/) { return; };
/** @brief experts please add description */
void processErrorInfo(const stsxyter::Message& mess);
/** @brief Process the information of the hit message and create a StsDigi from it */
void processHitInfo(const stsxyter::Message& mess);
/** @brief experts please add description */
void processStatusInfo(const stsxyter::Message& mess, uint32_t uIdx);
/** @brief experts please add description */
void processTsMsbInfo(const stsxyter::Message& mess, uint32_t uMessIdx, uint32_t uMsIdx);
/** @brief experts please add description here */
void refreshTsMsbFields(const uint32_t imslice, const size_t mstime);
/**
* @brief Set the Derived Ts Parameters
......@@ -99,7 +193,7 @@ protected:
* @return true
* @return false
*/
bool setDerivedTsParameters(size_t itimeslice) { return true; }
bool setDerivedTsParameters(size_t /*itimeslice*/) { return true; }
/**
* @brief Unpack a given microslice. To be implemented in the derived unpacker algos.
......@@ -112,7 +206,99 @@ protected:
*
* @remark The content of the µslice can only be accessed via the timeslice. Hence, we need to pass the pointer to the full timeslice
*/
bool unpack(const fles::Timeslice* ts, std::uint16_t icomp, UInt_t imslice) { return true; }
bool unpack(const fles::Timeslice* ts, std::uint16_t icomp, UInt_t imslice);
// Monitoring
/** @brief Potential (online) monitor for the unpacking process */
std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
/** @brief Current µSlice time */
uint64_t fMsStartTime = 0;
// Parameter members
/** @brief Map of DPB Identifier to DPB index */
std::map<uint32_t, uint32_t> fDpbIdIndexMap = {}; //!
/** @brief Current dpb id */
uint32_t fuCurrDpbIdx = 0;
/** @brief Masked components to print out missing component only once */
std::vector<bool> fvbMaskedComponents;
/** @brief Number of FEBs with StsXyter ASICs */
uint32_t fuNbFebs = 0; //!
/** @brief Number of eLinks per CROB */
uint32_t fNrElinksPerCrob = 0; //!
/** @brief Number of ASICs per CROB */
uint32_t fNrAsicsPerCrob = 0; //!
/** @brief Number of ASICs per FEB */
uint32_t fNrAsicsPerFeb = 0; //!
/** @brief Number of Channels per Asic */
uint32_t fNrChsPerAsic = 0; //!
/** @brief Number of Channels per FEB */
uint32_t fNrChsPerFeb = 0; //!
/** @brief Number of CROBs per DPB */
uint32_t fNrCrobPerDpb = 0; //!
/** @brief Vector used for the translation between eLink index and FEB index*/
std::vector<int> fElinkIdxToFebIdxVec = {};
/** @brief Vector used for the translation between eLink index and Asic index first is feb type A second is feb type b*/
std::vector<std::pair<uint32_t, uint32_t>> fElinkIdxToAsicIdxVec = {};
/** @brief Minimum adc cut to store a hit */
uint32_t fdAdcCut = 0;
/** @brief Time offsets per Asic??? @todo expert confirmation required */
std::vector<double> fvdTimeOffsetNsAsics = {};
/** @brief flag if channel mask is to be used or not. Set automatically via MaskNoisyChannels */
bool fbUseChannelMask = false;
/** @brief Vector of channel masks, [ NbFeb ][ NbCHanInFeb ], used only if fbUseChannelMask is true */
std::vector<std::vector<bool>> fvvbMaskedChannels = {}; //!
/** @brief FEB type, [ NbDpb ][ NbCrobPerDpb ][ NbFebsPerCrob ], 0 = A, 1 = B, -1 if inactive */
std::vector<std::vector<std::vector<int32_t>>> fviFebType = {}; //!
/** @brief STS address for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ] */
std::vector<int32_t> fviFebAddress; //!
/** @brief Module side for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ] */
std::vector<int32_t> fviFebSide; //!
/** @brief ADC gain in e-/b, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ] */
std::vector<double> fvdFebAdcGain; //!
/** @brief ADC offset in e-, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ] */
std::vector<double> fvdFebAdcOffs; //!
/** @brief Current TS MSB for each DPB */
std::vector<uint64_t> fvulCurrentTsMsb = {}; //!
/** @brief Current TS MSB cycle for DPB */
std::vector<uint32_t> fvuCurrentTsMsbCycle = {}; //!
/// Duplicate hits suppression
static const uint32_t kuMaxTsMsbDiffDuplicates = 8;
/** @brief TS of last hit message for each channel, [ AsicIdx ][ Chan ] */
std::vector<std::vector<uint16_t>> fvvusLastTsChan = {}; //!
/** @brief ADC of last hit message for each channel, [ AsicIdx ][ Chan ] */
std::vector<std::vector<uint16_t>> fvvusLastAdcChan = {}; //!
/** @brief TS MSB of last hit message for each channel, [ AsicIdx ][ Chan ] */
std::vector<std::vector<uint16_t>> fvvusLastTsMsbChan = {}; //!
/** @brief TS MSB cycle of last hit message for each channel, [ AsicIdx ][ Chan ] */
std::vector<std::vector<uint16_t>> fvvusLastTsMsbCycleChan = {}; //!
/** @brief Time of first valid hit (TS_MSB available), used as reference for evolution plots @todo move this to the monitor the algo does not need it!*/
double fdStartTime = 0;
/** @brief Time of first microslice, used as reference for evolution plots @todo move this to the monitor the algo does not need it!*/
double fdStartTimeMsSz = 0;
private:
ClassDef(CbmStsUnpackAlgo, 2)
......
......@@ -33,13 +33,29 @@ void CbmStsUnpackConfig::InitUnpacker()
// First choose the derived unpacking algorithm to be used and pass the raw to digi method
auto algo = chooseAlgo();
if (fDoLog) LOG(info) << fName << "::Init - SetParFilesBasePath";
algo->SetParFilesBasePath(fParFilesBasePath);
// Initialise the parameter containers required by the unpacker algo. Includes loading the corresponding ascii files
auto reqparvec = algo->GetParContainerRequest(fGeoSetupTag, fRunId);
initOk &= initParContainers(reqparvec);
// Set the minimum adc cut
algo->SetMinAdcCut(fdAdcCut);
// Set the single asics time offsets
algo->SetAsicTimeOffsetVec(fvdTimeOffsetNsAsics);
// Mask the noisy channels set by the user
for (auto chmask : fvChanMasks)
algo->MaskNoisyChannel(chmask.uFeb, chmask.uChan, chmask.bMasked);
// Now we have all information required to initialise the algorithm
algo->Init();
if (fMonitor) algo->SetMonitor(fMonitor);
// Pass the algo to its member in the base class
fAlgo = algo;
}
......
......@@ -18,9 +18,11 @@
#ifndef CbmStsUnpackConfig_H
#define CbmStsUnpackConfig_H
#include "CbmErrorMessage.h" // REMARK this should become a Sts specific container I Would propose PR
#include "CbmRecoUnpackConfig.tmpl"
#include "CbmStsDigi.h"
#include "CbmStsUnpackAlgo.h"
#include "CbmStsUnpackMonitor.h"
#include <FairLogger.h>
#include <Logger.h>
......@@ -33,7 +35,7 @@
#include <memory>
#include <vector>
class CbmStsUnpackConfig : public CbmRecoUnpackConfig<CbmStsUnpackAlgo, CbmStsDigi> {
class CbmStsUnpackConfig : public CbmRecoUnpackConfig<CbmStsUnpackAlgo, CbmStsDigi, CbmErrorMessage> {
public:
/**
......@@ -57,8 +59,15 @@ public:
/** @brief Assignment operator - not implemented **/
CbmStsUnpackConfig& operator=(const CbmStsUnpackConfig&) = delete;
// Getters
struct FebChanMaskReco {
UInt_t uFeb;
UInt_t uChan;
Bool_t bMasked;
};
// Getters
/** @brief Get the potentially added monitor. */
std::shared_ptr<CbmStsUnpackMonitor> GetMonitor() { return fMonitor; }
/**
* @brief Prepare the unpacker to be ready to run.
......@@ -66,7 +75,31 @@ public:
*/
void InitUnpacker();
void MaskNoisyChannel(UInt_t uFeb, UInt_t uChan, Bool_t bMasked = kTRUE)
{
fvChanMasks.emplace_back(FebChanMaskReco {uFeb, uChan, bMasked});
}
// Setters
/**
* @brief Set the Asic Time Offset
*
* @param asicid Idx of the ASIC with the given time offset
* @param value time offset
*/
void SetAsicTimeOffset(size_t asicid, double value)
{
if (fvdTimeOffsetNsAsics.size() < (asicid + 1)) fvdTimeOffsetNsAsics.resize(asicid + 1);
fvdTimeOffsetNsAsics.at(asicid) = value;
}
/** @brief Set the minimum adc cut value @param[in] value */
void SetMinAdcCut(uint32_t value) { fdAdcCut = value; }
/** @brief Add a monitor to the unpacker. @param value CbmStsUnpackMonitor */
void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> value) { fMonitor = value; }
protected:
/**
......@@ -76,6 +109,19 @@ protected:
*/
virtual std::shared_ptr<CbmStsUnpackAlgo> chooseAlgo();
/** @brief pointer to the monitor object */
std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
/** @brief Minimum adc cut to store a hit */
uint32_t fdAdcCut = 0;
/** @brief Vector with the Asic time offsets */
std::vector<double> fvdTimeOffsetNsAsics = {};
/// Temporary storage of user parameters
std::vector<FebChanMaskReco> fvChanMasks = {};
/** @brief Geometry setup tag for the given detector as used by CbmSetup objects */
std::string fGeoSetupTag = "";
......
This diff is collapsed.
// -----------------------------------------------------------------------------
// ----- -----
// ----- CbmStsUnpackMonitor -----
// ----- Created 26.01.2019 by P.-A. Loizeau -----
// ----- -----
// -----------------------------------------------------------------------------
#ifndef CbmStsUnpackMonitor_H
#define CbmStsUnpackMonitor_H
#include "CbmMcbm2018StsPar.h"
#include "Rtypes.h"
#include "TH1.h"
#include "TH2.h"
#include "TProfile.h"
#include <cstdint>
// FIXME
// #include "StsXyterMessage.h"
#include "raw/StsXyterMessage.h"
/** @remark On pointers to histograms: Why not use shared pointers here, than you do not need to take care of deleting them. Right now I think you have a massive memory leak. PR */
class CbmQaCanvas;
class CbmStsUnpackMonitor {
public:
CbmStsUnpackMonitor();
virtual ~CbmStsUnpackMonitor();
/** @brief Init all required parameter informations and histograms */
Bool_t Init(CbmMcbm2018StsPar* digiParSet);
Bool_t CreateHistograms(CbmMcbm2018StsPar* pUnpackPar);
Bool_t ResetHistograms();
Bool_t CreateDebugHistograms(CbmMcbm2018StsPar* pUnpackPar);
Bool_t ResetDebugHistograms();
Bool_t CreateMsComponentSizeHistos(UInt_t component);
Bool_t ResetMsComponentSizeHistos(UInt_t component);
void DrawCanvases();
void AddHistoToVector(TNamed* pointer, std::string sFolder = "")
{
fvpAllHistoPointers.push_back(std::pair<TNamed*, std::string>(pointer, sFolder));
}
std::vector<std::pair<TNamed*, std::string>> GetHistoVector() { return fvpAllHistoPointers; }
void AddCanvasToVector(CbmQaCanvas* pointer, std::string sFolder = "")
{