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

Include the TRD2D into the scheme plus some minor improvements

For the current situation with the TRD1D and TRD2D configs trying to create and access in principle the same "TrdDigi" branch a small workaround in the CbmRecoUnpack was required. Such that the first Config does not loose the correct pointer when the seconds overwrites the branch in the FairRootManager.
parent a7157030
......@@ -106,6 +106,15 @@ void run_unpack_tsa(std::string infile = "test.tsa", UInt_t runid = 0, const cha
trdconfig->SetSpadicObject(GetTrdSpadic(true));
// -------------
// ---- TRDFASP2D ----
auto trdfasp2dconfig = std::make_shared<CbmTrdUnpackConfigFasp2D>("", runid);
// trdfasp2dconfig->SetDebugState();
trdfasp2dconfig->SetDoWriteOutput();
trdfasp2dconfig->SetOutputBranchName("FaspTrdDigi");
std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data());
trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d);
// -------------
// ------------------------------------------------------------------------
// In general, the following parts need not be touched
......@@ -124,6 +133,7 @@ void run_unpack_tsa(std::string infile = "test.tsa", UInt_t runid = 0, const cha
unpack->SetUnpackConfig(psdconfig);
unpack->SetUnpackConfig(richconfig);
unpack->SetUnpackConfig(trdconfig);
unpack->SetUnpackConfig(trdfasp2dconfig);
// ------------------------------------------------------------------------
......
......@@ -45,7 +45,7 @@ class CbmRecoUnpackAlgo {
public:
/** @brief Create the Cbm Trd Unpack AlgoBase object */
CbmRecoUnpackAlgo(std::uint8_t flesSubsystemId, std::string name) : fFlesSubsystemId(flesSubsystemId), fName(name) {};
CbmRecoUnpackAlgo(std::string name) : fName(name) {};
/** @brief Destroy the Cbm Trd Unpack Task object */
virtual ~CbmRecoUnpackAlgo() {};
......@@ -68,8 +68,6 @@ protected:
std::vector<TOptOutB>* fOptOutBVec = {};
// Parameter storage members
/** @brief SubsystemId as defined by fles and encoded in the timeslices. To be set in the derived classes. Ensures, that only data of the asics connected to the given unpacker are passed to it by the Task/Device. */
std::uint8_t fFlesSubsystemId;
/** @brief Vector with the parameter containers and the paths to the connected ascii files of the TRD */
std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>> fParContVec = {};
......@@ -81,7 +79,7 @@ protected:
* @brief Time offset for the system
* @todo This should be module and channel dependent and included into the asic parameters
*/
std::int32_t fSystemTimeoffset = 0;
std::int32_t fSystemTimeOffset = 0;
/** @brief Check if we are looking at the first timeslice and if so extract the required TS parameters */
bool fIsFirstTs = true;
......@@ -267,13 +265,6 @@ public:
finish();
}
/**
* @brief Get the Fles Subsystem Id stored in fFlesSubsystemId
*
* @return std::uint8_t
*/
std::uint8_t GetFlesSubsystemId() { return fFlesSubsystemId; }
/**
* @brief Get the Name of the (derived) object
*
......@@ -352,6 +343,9 @@ public:
*/
void SetParFilesBasePath(std::string value) { fParFilesBasePath = value; }
/** @brief Set the global system time offset @remark in princible this should go to parameters */
void SetSystemTimeOffset(size_t value) { fSystemTimeOffset = value; }
/** @brief Set the start time of the current TS */
void SetTsStartTime(size_t value) { fTsStartTime = value; }
......
......@@ -62,7 +62,7 @@ protected:
/** @brief Pointer to the output vectors connected to the framework. */
std::vector<TOutput>* fOutputVec = nullptr;
/** @brief Name for the branch of the output, set together with the write output flag. */
/** @brief Name for the branch of the output, set if a non-default name is to be used. */
std::string fOutputBranchName = "";
/** @brief Pointer to the opt output vectors connected to the framework. */
......@@ -101,6 +101,7 @@ protected:
/** @brief Decision if the info msgs are supposed to be stored to a branch. */
bool fIsMC = false;
size_t fSystemTimeOffset = 0;
/** @brief Use this function to implement additional actions to be called once per TS, e.g. needed if more than the default output vector is used. */
virtual void reset() { return; };
......@@ -108,6 +109,13 @@ protected:
public:
// Getters
/**
* @brief Get the Output Branch Name
*
* @return std::string
*/
std::string GetOutputBranchName() { return fOutputBranchName.empty() ? TOutput::GetBranchName() : fOutputBranchName; }
/** @brief Get the name of the given derived config */
std::string GetName() { return fName; }
......@@ -139,18 +147,34 @@ public:
*/
std::shared_ptr<CbmRecoUnpackAlgo<TOutput, TOptOutA, TOptOutB>> GetUnpacker() { return fAlgo; };
void Init(FairRootManager* ioman)
/**
* @brief Init function of the configs to be called by CbmRecoUnpack()
* Initializes the output branches and calls InitUnpacker()
* @param ioman Pointer to the FairRootManager instance
* @param branchname by default TOutput::GetBranchName() is used for the first output. If branchname is not empty that branchname is used.
*/
void Init(FairRootManager* ioman, std::string branchname = "")
{
if (fDoWriteOutput) {
fOutputVec = new std::vector<TOutput>();
ioman->RegisterAny(TOutput::GetBranchName(), fOutputVec, kTRUE);
LOG(info) << fName << "::registerBranchToTree(" << TOutput::GetBranchName() << ")";
if (branchname.empty()) {
fOutputVec = new std::vector<TOutput>();
ioman->RegisterAny(TOutput::GetBranchName(), fOutputVec, kTRUE);
LOG(info) << fName << "::registerBranchToTree(" << TOutput::GetBranchName() << ")";
}
else {
fOutputVec = new std::vector<TOutput>();
ioman->RegisterAny(branchname.data(), fOutputVec, kTRUE);
LOG(info) << fName << "::registerBranchToTree(" << branchname.data() << ")";
}
}
/** @todo for the optional outputs it is more complicated to check if they exist. Needs exceptions for the std::nullptr_t. Should be added at some point in time. */
if (fDoWriteOptOutA) {
fOptOutAVec = new std::vector<TOptOutA>();
ioman->RegisterAny(fOptoutABranchName.data(), fOptOutAVec, kTRUE);
LOG(info) << fName << "::registerBranchToTree(" << fOptoutABranchName.data() << ")";
if (!fOptOutAVec) {
fOptOutAVec = new std::vector<TOptOutA>();
ioman->RegisterAny(fOptoutABranchName.data(), fOptOutAVec, kTRUE);
LOG(info) << fName << "::registerBranchToTree(" << fOptoutABranchName.data() << ")";
}
}
if (fDoWriteOptOutB) {
......@@ -158,10 +182,16 @@ public:
ioman->RegisterAny(fOptoutBBranchName.data(), fOptOutBVec, kTRUE);
LOG(info) << fName << "::registerBranchToTree(" << fOptoutBBranchName.data() << ")";
}
// Init the unpacker
InitUnpacker();
// Set the global system time offset
if (fAlgo) fAlgo->SetSystemTimeOffset(fSystemTimeOffset);
}
/** @brief Prepare the Unpacker algorithm for the run, to be implemented in the derived classes. */
virtual void InitUnpacker() = 0;
virtual void InitUnpacker() {};
/** @brief Reset called once per ReadEvent() */
void Reset()
......@@ -181,6 +211,14 @@ public:
*/
void SetDoWriteOutput(bool value = true) { fDoWriteOutput = value; }
/**
* @brief Set the Output Branch Name
* By default TOutput::GetBranchName() is used. Set this if you want to use a
* different output name
* @param value
*/
void SetOutputBranchName(std::string value) { fOutputBranchName = value; }
/**
* @brief Set the Do Write OptOutput A flag, without activation the opt out is not written to the sink
* @param branchname name of the branch in the output tree
......@@ -217,6 +255,14 @@ public:
*/
void SetIsMC(bool value = true) { fIsMC = value; }
/**
* @brief Set the Output Vec
*
* @tparam Output
* @param value
*/
void SetOutputVec(std::vector<TOutput>* value) { fOutputVec = value; }
/**
* @brief Set the Par Files Base Path (absolute directory path were the files are stored)
*
......@@ -224,6 +270,9 @@ public:
*/
void SetParFilesBasePath(std::string value) { fParFilesBasePath = value; }
/** @brief Set the global system time offset @remark in princible this should go to parameters */
void SetSystemTimeOffset(size_t value) { fSystemTimeOffset = value; }
protected:
/**
* @brief Initialise the parameter containers requested by the algorithm
......@@ -233,6 +282,10 @@ protected:
virtual Bool_t initParContainers(std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>* reqparvec)
{
if (fDoLog) LOG(info) << GetName() << "::Init - initParContainers";
if (!reqparvec) {
LOG(info) << GetName() << "::Init - initParContainers - empty requirements vector no parameters initialized.";
return kTRUE;
}
// Now get the actual ascii files and init the containers with the asciiIo
for (auto& pair : *reqparvec) {
......
......@@ -47,7 +47,6 @@ set(DEPENDENCIES
CbmBase
Base
CbmRecoBase
fles_ipc # for unpacker
)
GENERATE_LIBRARY()
......
......@@ -18,7 +18,7 @@
#include "PsdGbtReader-v0.00.h"
#include "PsdGbtReader-v1.00.h"
CbmPsdUnpackAlgo::CbmPsdUnpackAlgo() : CbmRecoUnpackAlgo(fgkFlesSubsystemIdTrdR, "CbmPsdUnpackAlgo") {}
CbmPsdUnpackAlgo::CbmPsdUnpackAlgo() : CbmRecoUnpackAlgo("CbmPsdUnpackAlgo") {}
// ----- Channel address
Int_t CbmPsdUnpackAlgo::getAddress(size_t channel)
......
......@@ -139,9 +139,6 @@ protected:
*/
bool unpack(const fles::Timeslice* ts, std::uint16_t icomp, UInt_t imslice);
/** @brief Fles Subsystem Identifier for the TRD R data */
static constexpr int fgkFlesSubsystemIdTrdR = static_cast<int>(fles::SubsystemIdentifier::PSD);
// Settings from parameters
UInt_t fuRawDataVersion = 0; //! Raw data versioning
/// Readout chain dimensions and mapping
......
......@@ -132,7 +132,6 @@ set(LINKDEF CbmRichRecoLinkDef.h)
Set(LIBRARY_NAME CbmRichReco)
Set(DEPENDENCIES
KF L1 CbmRichBase CbmRecoBase CbmBase CbmData Base MLP boost_regex Gdml
# fles_ipc # for unpacker
)
GENERATE_LIBRARY()
......
......@@ -14,7 +14,7 @@
#include <cstdint>
CbmRichUnpackAlgo::CbmRichUnpackAlgo() : CbmRecoUnpackAlgo(fgkFlesSubsystemIdTrdR, "CbmRichUnpackAlgo") {}
CbmRichUnpackAlgo::CbmRichUnpackAlgo() : CbmRecoUnpackAlgo("CbmRichUnpackAlgo") {}
CbmRichUnpackAlgo::~CbmRichUnpackAlgo() {}
......@@ -399,8 +399,8 @@ void CbmRichUnpackAlgo::writeOutputDigi(Int_t fpgaID, Int_t channel, Double_t ti
Double_t ToTcorr = fbDoToTCorr ? fUnpackPar.GetToTshift(fpgaID, channel) : 0.;
Int_t pixelUID = this->getPixelUID(fpgaID, channel);
//check ordering
Double_t finalTime = time + (Double_t) fMsRefTime - fSystemTimeoffset;
// Double_t finalTime = time - fSystemTimeoffset - fTsStartTime;
Double_t finalTime = time + (Double_t) fMsRefTime - fSystemTimeOffset;
// Double_t finalTime = time - fSystemTimeOffset - fTsStartTime;
Double_t lastTime = 0.;
......
......@@ -310,9 +310,6 @@ protected:
*/
bool unpack(const fles::Timeslice* ts, std::uint16_t icomp, UInt_t imslice);
/** @brief Fles Subsystem Identifier for the TRD R data */
static constexpr int fgkFlesSubsystemIdTrdR = static_cast<int>(fles::SubsystemIdentifier::RICH);
/** @brief Parameters for the unpacking */
CbmMcbm2018RichPar fUnpackPar;
......
......@@ -73,7 +73,6 @@ ${Boost_LIBRARY_DIRS}
# ----- Specify library dependences -------------------
Set(DEPENDENCIES
CbmBase CbmData CbmRecoBase CbmStsBase
fles_ipc # for unpacker
)
# ---------------------------------------------------------
......
......@@ -12,7 +12,7 @@
#include <RtypesCore.h>
CbmStsUnpackAlgo::CbmStsUnpackAlgo() : CbmRecoUnpackAlgo(fgkFlesSubsystemIdTrdR, "CbmStsUnpackAlgo") {}
CbmStsUnpackAlgo::CbmStsUnpackAlgo() : CbmRecoUnpackAlgo("CbmStsUnpackAlgo") {}
CbmStsUnpackAlgo::~CbmStsUnpackAlgo() {}
......
......@@ -114,9 +114,6 @@ protected:
*/
bool unpack(const fles::Timeslice* ts, std::uint16_t icomp, UInt_t imslice) { return true; }
/** @brief Fles Subsystem Identifier for the TRD R data */
static constexpr int fgkFlesSubsystemIdTrdR = static_cast<int>(fles::SubsystemIdentifier::STS);
private:
ClassDef(CbmStsUnpackAlgo, 2)
};
......
......@@ -59,8 +59,8 @@ unpack/CbmTrdUnpackAlgoR.cxx
unpack/CbmTrdUnpackAlgoLegacy2020R.cxx
unpack/CbmTrdUnpackMonitor.cxx
unpack/CbmTrdUnpackAlgo2D.cxx
unpack/CbmTrdUnpackConfig2D.cxx
unpack/CbmTrdUnpackAlgoFasp2D.cxx
unpack/CbmTrdUnpackConfigFasp2D.cxx
qa/CbmTrdClusterizerFastQa.cxx
qa/CbmTrdHitDensityQa.cxx
......@@ -103,7 +103,6 @@ Set(DEPENDENCIES
Base
CbmTrdBase
TMVA
fles_ipc # for unpacker
)
GENERATE_LIBRARY()
......@@ -33,8 +33,8 @@
#pragma link C++ class CbmTrdUnpackConfig + ;
#pragma link C++ class CbmTrdUnpackMonitor + ;
#pragma link C++ class CbmTrdUnpackAlgo2D + ;
#pragma link C++ class CbmTrdUnpackConfig2D + ;
#pragma link C++ class CbmTrdUnpackAlgoFasp2D + ;
#pragma link C++ class CbmTrdUnpackConfigFasp2D + ;
#pragma link C++ class CbmTrdElectronsTrainAnn + ;
#pragma link C++ class CbmTrdSetTracksPidWkn + ;
......
/* Copyright (C) 2010 - 2021 Goethe-University Frankfurt
SPDX-License-Identifier: GPL-3.0-only
Authors: Pascal Raisig */
#include "CbmTrdUnpackAlgo2D.h"
#include "CbmMcbm2020TrdTshiftPar.h"
#include "CbmTrdDigi.h"
#include "CbmTrdHardwareSetupR.h" // for channel address parameters
#include "CbmTrdParSetAsic.h"
#include <FairParGenericSet.h>
#include <FairTask.h>
#include <Logger.h>
#include <Rtypes.h>
#include <RtypesCore.h>
CbmTrdUnpackAlgo2D::CbmTrdUnpackAlgo2D() : CbmRecoUnpackAlgo(fgkFlesSubsystemIdTrdR, "CbmTrdUnpackAlgo2D") {}
CbmTrdUnpackAlgo2D::~CbmTrdUnpackAlgo2D() {}
// ---- digestOutput ----
void CbmTrdUnpackAlgo2D::digestOutput(std::unique_ptr<CbmTrdDigi> digi)
{
++fNrCreatedDigis;
// If requested lets monitor something
if (fMonitor) { fMonitor->FillHistos(digi.get(), nullptr); }
// Save the digi
fOutputVec.emplace_back(*std::move(digi));
}
// ---- getAsicAddress ----
std::uint32_t CbmTrdUnpackAlgo2D::getAsicAddress(std::uint32_t criid, std::uint32_t crobid, std::uint32_t elinkid)
{
size_t spadicHwAddress = 0;
spadicHwAddress = elinkid + (CbmTrdParAsic::kCriIdPosition * criid) + (CbmTrdParAsic::kCrobIdPosition * crobid);
auto mapIt = fSpadicAddressMap.find(spadicHwAddress); // check if asic exists
if (mapIt == fSpadicAddressMap.end()) {
LOG(info) << fName
<< "::makeDigi - No asic address "
"found for Spadic hardware address "
<< spadicHwAddress;
return 0;
}
return mapIt->second;
}
// ---- getAsicAddress ----
std::uint32_t CbmTrdUnpackAlgo2D::getChannelId(std::uint32_t asicaddress, std::uint32_t elinkid,
std::uint32_t elinkchannelid)
{
// GetChannelId per eLink add NSPADICCH / 2 to the second(first) eLink in the case we start with odd(even) eLinks, since, our mapping is based on odd eLinks
auto asicChannelId =
(elinkid % 2) == fIsFirstChannelsElinkEven ? elinkchannelid : elinkchannelid + (CbmTrdSpadic::GetNrChannels() / 2);
auto channelId = (fAsicChannelMap.find(asicaddress))->second.at(asicChannelId);
return channelId;
}
// ---- initParSet(FairParGenericSet* parset) ----
Bool_t CbmTrdUnpackAlgo2D::initParSet(FairParGenericSet* parset)
{
LOG(info) << fName << "::initParSet - for container " << parset->ClassName();
if (parset->IsA() == CbmTrdParSetAsic::Class()) return initParSet(static_cast<CbmTrdParSetAsic*>(parset));
if (parset->IsA() == CbmTrdParSetDigi::Class()) return initParSet(static_cast<CbmTrdParSetDigi*>(parset));
if (parset->IsA() == CbmMcbm2020TrdTshiftPar::Class())
return initParSet(static_cast<CbmMcbm2020TrdTshiftPar*>(parset));
// If we do not know the derived ParSet class we return false
LOG(error)
<< fName << "::initParSet - for container " << parset->ClassName()
<< " failed, since CbmTrdUnpackAlgo2D::initParSet() does not know the derived ParSet and what to do with it!";
return kFALSE;
}
// ---- initParSet(CbmTrdParSetAsic* parset) ----
Bool_t CbmTrdUnpackAlgo2D::initParSet(CbmTrdParSetAsic* parset)
{
LOG(debug) << fName << "::initParSetAsic - ";
CbmTrdHardwareSetupR hwSetup;
fSpadicAddressMap = hwSetup.CreateHwToSwAsicAddressTranslatorMap(parset);
if (fSpadicAddressMap.empty()) {
LOG(error) << fName << "::initParSetAsic - SpadicAddressMap creation failed, the map is empty";
return kFALSE;
}
// at least check that the loaded map is not empty
fAsicChannelMap = hwSetup.CreateAsicChannelMap(parset);
if (fAsicChannelMap.empty()) {
LOG(error) << fName << "::initParSetAsic - AsicChannelMap creation failed, the map is empty";
return kFALSE;
}
LOG(info) << fName << "::initParSetAsic - Successfully initialized Spadic hardware address map";
return kTRUE;
}
// ---- initParSet(CbmTrdParSetDigi* parset) ----
Bool_t CbmTrdUnpackAlgo2D::initParSet(CbmTrdParSetDigi* parset)
{
Bool_t initOk = kTRUE;
// The monitor needs the ParSetDigi to extract module informations and other stuff
if (fMonitor) {
LOG(info) << fName << "::initParSet(CbmTrdParSetDigi) - Forwarding ParSetDigi to the monitor";
initOk &= fMonitor->Init(parset);
}
return initOk;
}
// ---- initParSet(CbmMcbm2020TrdTshiftPar* parset) ----
Bool_t CbmTrdUnpackAlgo2D::initParSet(CbmMcbm2020TrdTshiftPar* parset)
{
auto maptimeshifts = parset->GetTimeshiftsMap();
fTimeshiftsMap.clear();
fTimeshiftsMap.insert(maptimeshifts->begin(), maptimeshifts->end());
LOG(info) << fName << "::initParSetTimeshift2020() - Parsing timeshift correction map to unpacker algo";
return (!fTimeshiftsMap.empty());
}
// ---- initR ----
Bool_t CbmTrdUnpackAlgo2D::initR()
{
auto initOk = kTRUE;
// Check if we have already a Spadic object. If not check if we have a raw to digi object, it has by default a Spadic object. If we do not have a rtd object we create a default spadic object on our own.
if (!fSpadic) {
// First we check if there is a spadic definition stored in the raw to digi method
if (fRTDMethod) fSpadic = fRTDMethod->GetSpadicObject();
// If we still do not have spadic, we create it on our own
if (!fSpadic) fSpadic = std::make_shared<CbmTrdSpadic>();
}
if (!fSpadic) {
LOG(error) << fName
<< "::initR - We are missing a CbmTrdSpadic object, to extract the basic spadic functionalities!";
initOk &= kFALSE;
}
if (fMonitor) fMonitor->SetSpadicObject(fSpadic);
return initOk;
}
ClassImp(CbmTrdUnpackAlgo2D)
/* Copyright (C) 2010 - 2021 Goethe-University Frankfurt
SPDX-License-Identifier: GPL-3.0-only
Authors: Pascal Raisig */
/**
* @file CbmTrdUnpackAlgo2D.h
* @author Pascal Raisig (praisig@ikf.uni-frankfurt.de)
* @brief Baseclass for the TrdR unpacker algorithms
* @version 0.1
* @date 2021-04-21
*
* @copyright Copyright (c) 2021
*
* This is the base class for the algorithmic part of the tsa data unpacking
* processes of the CbmTrd.
* The actual translation from tsa to digi happens in the derived classes.
*
*
*/
#ifndef CbmTrdUnpackAlgo2D_H
#define CbmTrdUnpackAlgo2D_H
#include "CbmMcbm2020TrdTshiftPar.h"
#include "CbmRecoUnpackAlgo.tmpl"
#include "CbmTrdDigi.h"
#include "CbmTrdParSetAsic.h"
#include "CbmTrdRawMessageSpadic.h"
#include "CbmTrdRawToDigiBaseR.h"
#include "CbmTrdSpadic.h"
#include "CbmTrdUnpackMonitor.h"
#include "Timeslice.hpp" // timeslice
#include <Rtypes.h> // for types
#include <RtypesCore.h>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <utility>
class CbmTrdUnpackAlgo2D : public CbmRecoUnpackAlgo<CbmTrdDigi> {
public:
/** @brief Create the Cbm Trd Unpack AlgoBase object */
CbmTrdUnpackAlgo2D();
/** @brief Destroy the Cbm Trd Unpack Task object */
virtual ~CbmTrdUnpackAlgo2D();
/** @brief Copy constructor - not implemented **/
CbmTrdUnpackAlgo2D(const CbmTrdUnpackAlgo2D&) = delete;
/** @brief Assignment operator - not implemented **/
CbmTrdUnpackAlgo2D& operator=(const CbmTrdUnpackAlgo2D&) = delete;
// Setters
/** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
void SetMonitor(std::shared_ptr<CbmTrdUnpackMonitor> monitor) { fMonitor = monitor; }
/**
* @brief Set the Raw To Digi Method
*
* @param value
*/
void SetRawToDigiMethod(std::shared_ptr<CbmTrdRawToDigiBaseR> value) { fRTDMethod = value; }
/**
* @brief Set the Spadic Object
*
* @param value
*/
void SetSpadicObject(std::shared_ptr<CbmTrdSpadic> value) { fSpadic = value; }
protected:
/**
* @brief Handle the output created by the explicit algorithms. E.g. write to output vectors.
*
* @param digi
* @param raw
*/
void digestOutput(std::unique_ptr<CbmTrdDigi> digi);
/** @brief Finish function for this algorithm base clase */
void finish()
{
finishDerived();
// Finish the monitor if we have one
if (fMonitor) fMonitor->Finish();
}
/** @brief Function that allows special calls during Finish in the derived algos */
// virtual void finishDerived() = 0;
virtual void finishDerived() { return; }
/**
* @brief Get the Asic Address (CbmAddress scheme) for the given hardware Ids
*
* @param criid
* @param crobid
* @param elinkid
* @return std::uint32_t
*/
virtual std::uint32_t getAsicAddress(std::uint32_t criid, std::uint32_t crobid, std::uint32_t elinkid);
/**
* @brief Get the Channel Id (CbmAddress scheme) for the given hardware Ids
*
* @param asicaddress
* @param elinkid
* @param elinkchannelid
* @return std::uint32_t
*/
std::uint32_t getChannelId(std::uint32_t asicaddress, std::uint32_t elinkid, std::uint32_t elinkchannelid);
/**
* @brief Additional initialisation function for all BaseR derived algorithms.
*