Commit 31987fbc authored by Joerg Stelzer's avatar Joerg Stelzer
Browse files

L1Calo config consolidation

 * Threshold values and ptMinToTopo stored internally in MeV as unsigned int
 * Access methods in MeV, GeV (float), and counts (using energyResolution)
 * Change "emscale" and "jetscale" to "resolutionMeV" in the menu and C++ sw
 * Added eta-dependend pTMinToTopo to jFEX jets
 * Fix EM*V thresholds in the menu such that the eta-ranges and thrvalues match Run 2
 * Some cleanup of ThresholdDefLegacy.py and ItemDef.py to reduce dependence on menu version
 * Added XS definition in menu and access software
 * Added L1Calo specific base class for L1Thresholds (many commonalities between L1Calo thresholds that don't apply to L1Muon thresholds)
 * Change RangeValue from struct to class with proper access functions to member variables
 * Restructur of upload() member function to avoid calling virtual methods in constructor
 * FIX BUG: access to TopoAlgs by output is working now
parent a137b1d5
......@@ -81,6 +81,8 @@ namespace TrigConf {
const TrigConf::TriggerLine & triggerLine( const std::string & lineName ) const;
bool isLegacy() const { return m_isLegacy; }
private:
/** Update the internal members */
......@@ -89,7 +91,8 @@ namespace TrigConf {
ConnectorType m_type;
std::vector<TrigConf::TriggerLine> m_triggerLines[2][2];
std::map<std::string, TrigConf::TriggerLine*> m_lineByName;
bool m_isLegacy;
};
}
......
......@@ -17,6 +17,7 @@ namespace TrigConf {
class L1ThrExtraInfoBase;
class L1ThrExtraInfo_EMTAULegacy;
class L1ThrExtraInfo_JETLegacy;
class L1ThrExtraInfo_XSLegacy;
class L1ThrExtraInfo_eEMTAU;
class L1ThrExtraInfo_jJ;
class L1ThrExtraInfo_jTAU;
......@@ -32,6 +33,7 @@ namespace TrigConf {
const L1ThrExtraInfo_EMTAULegacy & EM() const;
const L1ThrExtraInfo_EMTAULegacy & TAU() const;
const L1ThrExtraInfo_JETLegacy & JET() const;
const L1ThrExtraInfo_XSLegacy & XS() const;
const L1ThrExtraInfo_eEMTAU & eEM() const;
const L1ThrExtraInfo_eEMTAU & eTAU() const;
const L1ThrExtraInfo_jJ & jJ() const;
......@@ -44,7 +46,7 @@ namespace TrigConf {
bool hasInfo(const std::string & typeName) const;
private:
// map from threshold type to
// map from threshold type to L1ThrExtraInfo object
std::map<std::string, std::shared_ptr<TrigConf::L1ThrExtraInfoBase>> m_thrExtraInfo{};
std::shared_ptr<TrigConf::L1ThrExtraInfoBase> m_emptyInfo{ nullptr };
};
......@@ -53,97 +55,144 @@ namespace TrigConf {
class L1ThrExtraInfo_EMTAULegacy final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_EMTAULegacy(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_EMTAULegacy();
virtual std::string className() const;
unsigned int emScale() const;
unsigned int ptMinToTopo() const;
L1ThrExtraInfo_EMTAULegacy(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_EMTAULegacy() = default;
virtual std::string className() const { return "L1ThrExtraInfo_EMTAULegacy"; }
unsigned int emScale() const { return 1000 / resolutionMeV(); }
float ptMinToTopo() const { return m_ptMinToTopoMeV/1000.0f; }
unsigned int ptMinToTopoMeV() const { return m_ptMinToTopoMeV; }
unsigned int ptMinToTopoCounts() const { return energyInCounts( m_ptMinToTopoMeV, resolutionMeV() ); }
const IsolationLegacy & isolation(const std::string & thrType, size_t bit) const;
private:
/** Update the internal members */
virtual void update();
void load();
/** EM specific data */
unsigned int m_emScale{1};
unsigned int m_ptMinToTopo{0};
unsigned int m_ptMinToTopoMeV{0}; // in MeV
std::map<std::string,std::vector<IsolationLegacy>> m_isolation{};
};
class L1ThrExtraInfo_JETLegacy final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_JETLegacy(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_JETLegacy();
unsigned int jetScale() const;
unsigned int ptMinToTopoLargeWindow() const;
unsigned int ptMinToTopoSmallWindow() const;
L1ThrExtraInfo_JETLegacy(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_JETLegacy() = default;
unsigned int jetScale() const { return 1000 / resolutionMeV(); }
float ptMinToTopoLargeWindow() const { return m_ptMinToTopoLargeWindowMeV / 1000.0f; }
float ptMinToTopoSmallWindow() const { return m_ptMinToTopoSmallWindowMeV / 1000.0f; }
unsigned int ptMinToTopoLargeWindowMeV() const { return m_ptMinToTopoLargeWindowMeV; }
unsigned int ptMinToTopoSmallWindowMeV() const { return m_ptMinToTopoSmallWindowMeV; }
unsigned int ptMinToTopoLargeWindowCounts() const { return energyInCounts( m_ptMinToTopoLargeWindowMeV, resolutionMeV() ); }
unsigned int ptMinToTopoSmallWindowCounts() const { return energyInCounts( m_ptMinToTopoSmallWindowMeV, resolutionMeV() ); }
private:
/** Update the internal members */
virtual void update();
void load();
/** JET specific data */
unsigned int m_jetScale{1};
unsigned int m_ptMinToTopoLargeWindow{0};
unsigned int m_ptMinToTopoSmallWindow{0};
unsigned int m_ptMinToTopoLargeWindowMeV{0};
unsigned int m_ptMinToTopoSmallWindowMeV{0};
};
class L1ThrExtraInfo_XSLegacy final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_XSLegacy(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_XSLegacy() = default;
unsigned int xeMin() const { return m_xeMin; };
unsigned int xeMax() const { return m_xeMax; };
unsigned int teSqrtMin() const { return m_teSqrtMin; };
unsigned int teSqrtMax() const { return m_teSqrtMax; };
unsigned int xsSigmaScale() const { return m_xsSigmaScale; };
unsigned int xsSigmaOffset() const { return m_xsSigmaOffset; };
private:
/** Update the internal members */
void load();
/** XS specific data */
unsigned int m_xeMin{0};
unsigned int m_xeMax{0};
unsigned int m_teSqrtMin{0};
unsigned int m_teSqrtMax{0};
unsigned int m_xsSigmaScale{0};
unsigned int m_xsSigmaOffset{0};
};
/***********************************
* Extra info for new thresholds
***********************************/
class L1ThrExtraInfo_eEMTAU final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_eEMTAU(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_eEMTAU();
unsigned int ptMinToTopo() const;
L1ThrExtraInfo_eEMTAU(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_eEMTAU() = default;
float ptMinToTopo() const { return m_ptMinToTopoMeV/1000.0f; }
unsigned int ptMinToTopoMeV() const { return m_ptMinToTopoMeV; }
unsigned int ptMinToTopoCounts() const { return energyInCounts( m_ptMinToTopoMeV, resolutionMeV() ); }
const TrigConf::Isolation & isolation(TrigConf::Isolation::WP wp, int eta) const;
const ValueWithEtaDependence<TrigConf::Isolation> & isolation(TrigConf::Isolation::WP wp) const;
private:
/** Update the internal members */
virtual void update();
void load();
/** eEM specific data */
unsigned int m_ptMinToTopo{0};
unsigned int m_ptMinToTopoMeV{0};
std::map<TrigConf::Isolation::WP, ValueWithEtaDependence<Isolation>> m_isolation{};
};
class L1ThrExtraInfo_jJ final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_jJ(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_jJ();
unsigned int ptMinToTopoSmall(int eta) const;
unsigned int ptMinToTopoLarge(int eta) const;
L1ThrExtraInfo_jJ(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_jJ() = default;
float ptMinToTopoLarge(int eta = 0) const { return ptMinToTopoLargeMeV(eta) / 1000.0f; }
float ptMinToTopoSmall(int eta = 0) const { return ptMinToTopoSmallMeV(eta) / 1000.0f; }
unsigned int ptMinToTopoLargeMeV(int eta = 0) const { return m_ptMinToTopoLargeMeV.at(eta); }
unsigned int ptMinToTopoSmallMeV(int eta = 0) const { return m_ptMinToTopoSmallMeV.at(eta); }
unsigned int ptMinToTopoLargeCounts(int eta = 0) const { return energyInCounts( ptMinToTopoLargeMeV(eta), resolutionMeV() ); }
unsigned int ptMinToTopoSmallCounts(int eta = 0) const { return energyInCounts( ptMinToTopoSmallMeV(eta), resolutionMeV() ); }
private:
/** Update the internal members */
virtual void update();
void load();
/** jJ specific data */
std::map<std::pair<int,int>,unsigned int> m_ptMinToTopoSmall{};
std::map<std::pair<int,int>,unsigned int> m_ptMinToTopoLarge{};
ValueWithEtaDependence<unsigned int> m_ptMinToTopoSmallMeV{"jJptMinTopoLarge"};
ValueWithEtaDependence<unsigned int> m_ptMinToTopoLargeMeV{"jJptMinTopoSmall"};
//std::map<std::pair<int,int>,unsigned int> m_ptMinToTopoSmallMeV{};
//std::map<std::pair<int,int>,unsigned int> m_ptMinToTopoLargeMeV{};
};
class L1ThrExtraInfo_jTAU final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_jTAU(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_jTAU();
unsigned int ptMinToTopo() const;
L1ThrExtraInfo_jTAU(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_jTAU() = default;
unsigned int ptMinToTopo() const { return m_ptMinToTopo; }
private:
/** Update the internal members */
virtual void update();
void load();
/** jTAU specific data */
unsigned int m_ptMinToTopo{0};
};
class L1ThrExtraInfo_gXE final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_gXE(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_gXE();
L1ThrExtraInfo_gXE(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_gXE() = default;
private:
/** Update the internal members */
virtual void update();
void load();
/** gXE specific data */
};
class L1ThrExtraInfo_MU final : public L1ThrExtraInfoBase {
public:
L1ThrExtraInfo_MU(const std::string & thrTypeName, const ptree & data);
virtual ~L1ThrExtraInfo_MU();
L1ThrExtraInfo_MU(const std::string & thrTypeName, const ptree & data) :
L1ThrExtraInfoBase(thrTypeName, data) { load(); }
virtual ~L1ThrExtraInfo_MU() = default;
unsigned int rpcIdxForPt(unsigned int pt) const;
unsigned int tgcIdxForPt(unsigned int pt) const;
std::vector<unsigned int> knownRpcPtValues() const;
......@@ -152,7 +201,7 @@ namespace TrigConf {
const std::map<std::string, std::vector<unsigned int>> & exlusionList(const std::string & listName) const;
private:
/** Update the internal members */
virtual void update();
void load();
/** MU specific data */
std::map<unsigned int, unsigned int> m_rpcPtMap; // map of pt value (1..~20) to road index (0..5)
std::map<unsigned int, unsigned int> m_tgcPtMap; // map of pt value (1..~30) to road index (0..15)
......
......@@ -14,50 +14,127 @@ namespace TrigConf {
* L1Calo legacy thresholds
*
************************************/
class L1Threshold_EM final : public L1Threshold {
class L1Threshold_EM final : public L1Threshold_Calo {
public:
L1Threshold_EM( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data);
L1Threshold_EM( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) { load(); }
virtual ~L1Threshold_EM() = default;
unsigned int thrValueCounts(int eta = 0) const override;
uint16_t isolationMask(int eta) const { return m_isolationMask.at(eta); }
void print(std::ostream & os = std::cout) const override;
protected:
virtual void update() override {
L1Threshold_Calo::update();
load();
}
private:
virtual void update() override;
void load();
ValueWithEtaDependence<uint16_t> m_isolationMask{""};
};
class L1Threshold_TAU final : public L1Threshold {
class L1Threshold_TAU final : public L1Threshold_Calo {
public:
L1Threshold_TAU( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data);
L1Threshold_TAU( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) { load(); }
virtual ~L1Threshold_TAU() = default;
// access functions
uint16_t isolationMask() const { return m_isolationMask; }
protected:
virtual void update() override {
L1Threshold_Calo::update();
load();
}
private:
virtual void update() override;
void load();
uint16_t m_isolationMask;
};
class L1Threshold_XE final : public L1Threshold_Calo {
public:
L1Threshold_XE( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) {};
virtual ~L1Threshold_XE() = default;
};
class L1Threshold_XS final : public L1Threshold_Calo {
public:
L1Threshold_XS( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) {};
virtual ~L1Threshold_XS() = default;
};
class L1Threshold_TE final : public L1Threshold_Calo {
public:
L1Threshold_TE( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) {};
virtual ~L1Threshold_TE() = default;
};
/************************************
*
* NIM and internal thresholds
*
************************************/
class L1Threshold_NIM final : public L1Threshold {
public:
L1Threshold_NIM( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold(name, type, m_extraInfo, data) {};
virtual ~L1Threshold_NIM() = default;
};
class L1Threshold_internal final : public L1Threshold {
public:
L1Threshold_internal( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold(name, type, m_extraInfo, data) {};
virtual ~L1Threshold_internal() = default;
};
/************************************
*
* New eFEX thresholds
*
************************************/
class L1Threshold_eEM final : public L1Threshold {
class L1Threshold_eEM final : public L1Threshold_Calo {
public:
L1Threshold_eEM() = default;
L1Threshold_eEM( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data);
L1Threshold_eEM( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) { load(); }
virtual ~L1Threshold_eEM() = default;
// access functions
Isolation::WP reta() const { return m_reta; }
Isolation::WP rhad() const { return m_rhad; }
Isolation::WP wstot() const { return m_wstot; }
protected:
virtual void update() override {
L1Threshold_Calo::update();
load();
}
private:
virtual void update() override;
void load();
// the isolation requirement
Isolation::WP m_reta { Isolation::WP::NONE };
Isolation::WP m_rhad { Isolation::WP::NONE };
Isolation::WP m_wstot { Isolation::WP::NONE };
};
class L1Threshold_eTAU final : public L1Threshold_Calo {
public:
L1Threshold_eTAU( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold_Calo(name, type, m_extraInfo, data) { load(); }
virtual ~L1Threshold_eTAU() = default;
protected:
virtual void update() override {
L1Threshold_Calo::update();
load();
}
private:
void load();
};
/************************************
......@@ -67,9 +144,12 @@ namespace TrigConf {
************************************/
class L1Threshold_MU final : public L1Threshold {
public:
L1Threshold_MU() = default;
L1Threshold_MU( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data);
L1Threshold_MU( const std::string & name, const std::string & type, std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo, const ptree & data) :
L1Threshold(name, type, m_extraInfo, data) { load(); }
virtual ~L1Threshold_MU() = default;
float thrValue(int eta = 0) const override;
unsigned int ptBarrel() const { return m_ptBarrel; }
unsigned int ptEndcap() const { return m_ptEndcap; }
unsigned int ptForward() const { return m_ptForward; }
......@@ -79,8 +159,14 @@ namespace TrigConf {
const std::string & region() const { return m_region; }
const std::string & tgcFlag() const { return m_tgcFlag; }
const std::string & rpcExclROIList() const { return m_rpcExclROIList; }
protected:
virtual void update() override {
L1Threshold::update();
load();
}
private:
virtual void update() override;
void load();
unsigned int m_ptBarrel{0};
unsigned int m_ptEndcap{0};
unsigned int m_ptForward{0};
......
......@@ -12,6 +12,15 @@
namespace TrigConf {
/** @brief helper funtion to translate energies into counts
* @param energyMeV [in] energy value in MeV
* @param energyResolutionMeV [in] energy resolution in MeV (energy that corresponds to one count
* @return energy counts
*
* The funtion throws a runtime error if the energy value is not a multiple of the resolution
*/
unsigned int energyInCounts(unsigned int energyMeV, unsigned int energyResolutionMeV);
/** class to implement a L1 threshold cut that varies with eta
*
* A vector of RangeValue objects describes this eta
......@@ -23,12 +32,20 @@ namespace TrigConf {
*/
template<class T>
class ValueWithEtaDependence {
struct RangeValue {
T value {}; // the value (energy, set of isolation variables)
int etaMin { -49 }; // range boundaries, always inclusive
int etaMax { 49 }; // etaMin is always smaller than etaMax, e.g. on the negative side: etaMin=-49, etaMax=-31
unsigned int priority {0}; // higher number has higher priority when resolving overlapping regions
bool symmetric { true }; // if true, also applies to the opposity side ( requires etaMax to be positive )
class RangeValue {
public:
RangeValue(const T & value, int etaMin, int etaMax, unsigned int priority, bool symmetric);
const T & value() const { return m_value; }
int etaMin() const { return m_etaMin; };
int etaMax() const { return m_etaMax; };
unsigned int priority() const { return m_priority; }
bool symmetric() const { return m_symmetric; }
private:
T m_value {}; // the value (energy, set of isolation variables)
int m_etaMin { -49 }; // range boundaries, always inclusive
int m_etaMax { 49 }; // etaMin is always smaller than etaMax, e.g. on the negative side: etaMin=-49, etaMax=-31
unsigned int m_priority {0}; // higher number has higher priority when resolving overlapping regions
bool m_symmetric { true }; // if true, also applies to the opposity side ( requires etaMax to be positive )
};
public:
typedef typename std::vector<RangeValue>::const_iterator const_iterator;
......@@ -53,34 +70,42 @@ namespace TrigConf {
static std::unique_ptr<L1ThrExtraInfoBase> createExtraInfo(const std::string & thrTypeName, const ptree & data);
/** Constructors */
// Constructors
L1ThrExtraInfoBase() = delete;
L1ThrExtraInfoBase(const L1ThrExtraInfoBase &) = delete;
L1ThrExtraInfoBase& operator=(const L1ThrExtraInfoBase&) = delete;
L1ThrExtraInfoBase(L1ThrExtraInfoBase&&) = default;
L1ThrExtraInfoBase& operator=(L1ThrExtraInfoBase&&) = default;
virtual ~L1ThrExtraInfoBase() = default;
/** Constructor initialized with configuration data
* @param data The data containing the L1 menu
*/
// Constructor initialized with configuration data
// @param data The data containing the L1 menu
//
L1ThrExtraInfoBase(const std::string & thrTypeName, const ptree & data);
/** Destructor */
virtual ~L1ThrExtraInfoBase();
virtual std::string className() const;
virtual std::string className() const override {
return "L1ThrExtraInfoBase";
}
const std::string & thresholdTypeName() const;
bool hasExtraInfo() const;
protected:
unsigned int resolutionMeV() const {
return m_resolutionMeV;
}
protected:
virtual void upload() {
load();
}
std::map<std::string, DataStructure> m_extraInfo{};
private:
/** Update the internal members */
virtual void update();
// load the internal members
void load();
unsigned int m_resolutionMeV;
};
......@@ -93,6 +118,13 @@ namespace TrigConf {
class L1Threshold : public DataStructure {
public:
/** @brief static method to create type-specific L1Thresholds
* @param name [in] name of the threshold
* @param type [in] type of the threshold (e.g. EM, TAU, JET, XE, TE, eEM, jJ, gXE, ...)
* @param extraInfo [in] link to the extra info for the given type
* @param data [in] the threshold definition (json wrapped into a ptree)
* @return shared ptr of the created threshold (returns ownership)
*/
static std::shared_ptr<L1Threshold> createThreshold( const std::string & name, const std::string & type,
std::weak_ptr<L1ThrExtraInfoBase> extraInfo, const ptree & data );
......@@ -126,13 +158,61 @@ namespace TrigConf {
/** Accessor to the threshold value for eta-dependent threholds
* @param eta the eta value should be given for potentially eta-dependent thresholds
* must be overwritten by L1Threshold_Calo and L1Threnshold_MU
*/
unsigned int thrValue(int eta = 0) const;
virtual float thrValue(int eta = 0) const;
protected:
/** Update the internal data after modification of the data object */
virtual void update() override;
std::weak_ptr<L1ThrExtraInfoBase> m_extraInfo;
private:
void load();
std::string m_type{""}; ///< threshold type
unsigned int m_mapping{0}; ///< unique identifier amongst thresholds of the same type
};
class L1Threshold_Calo : public L1Threshold {
public:
/** Constructor */
L1Threshold_Calo() = delete;
/** Constructor initialized with configuration data
* @param name threshold name
* @param type threshold type name
* @param extraInfo The information that is specific for this threshold type
* @param data The data containing the L1 threshold
*/
L1Threshold_Calo( const std::string & name, const std::string & type,
std::weak_ptr<L1ThrExtraInfoBase> extraInfo, const ptree & data);
/** Destructor */
virtual ~L1Threshold_Calo() = default;
/** Accessor to the threshold value for eta-dependent threholds
* @param eta the eta value should be given for potentially eta-dependent thresholds
*/
virtual float thrValue(int eta = 0) const;
virtual unsigned int thrValueCounts(int eta = 0) const;
virtual unsigned int thrValueMeV(int eta = 0) const;