diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h index 60d9b266b14e28cf79cb2e2688c77b11e1870743..03c4fe28ed5656207ddaee6dd82289fd96d41d42 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/LinkDef.h @@ -296,7 +296,7 @@ #pragma link C++ class TFCSInvisibleParametrization+; #pragma link C++ class TFCSInitWithEkin+; #pragma link C++ class TFCSEnergyInterpolationLinear+; -#pragma link C++ class TFCSEnergyInterpolationPiecewiseLinear+; +#pragma link C++ class TFCSEnergyInterpolationPiecewiseLinear-; #pragma link C++ class TFCSEnergyInterpolationSpline+; #pragma link C++ class TFCSParametrizationChain-; #pragma link C++ class TFCSParametrizationBinnedChain+; diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationPiecewiseLinear.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationPiecewiseLinear.h index cf36dfce4639cc0dfe13422dda2c272b4ee7cba2..7d3af7c14e133ee7766fe8ad1333645f7b654226 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationPiecewiseLinear.h +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSEnergyInterpolationPiecewiseLinear.h @@ -13,6 +13,8 @@ #include "TCanvas.h" #include "TGraph.h" #include "TAxis.h" +//TBuffer include required for custom class streamer +#include "TBuffer.h" class TFCSEnergyInterpolationPiecewiseLinear: public TFCSParametrization { @@ -34,20 +36,21 @@ public: void InitFromArrayInLogEkin(Int_t np, const Double_t logEkin[], const Double_t response[]); void InitFromArrayInEkin(Int_t np, const Double_t Ekin[], const Double_t response[]); - virtual FCSReturnCode simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const override; + virtual FCSReturnCode simulate(TFCSSimulationState& simulstate, const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const override; void Print(Option_t *option="") const override; - static void unit_test(TFCSSimulationState* simulstate = nullptr,TFCSTruthState* truth = nullptr, const TFCSExtrapolationState* extrapol = nullptr, TGraph* grlinear = nullptr); + static void unit_test(TFCSSimulationState* simulstate = nullptr, TFCSTruthState* truth = nullptr, const TFCSExtrapolationState* extrapol = nullptr, TGraph* grlinear = nullptr); private: - ROOT::Math::Interpolator m_linInterpol; - double m_minXValue; - double m_maxXValue; - int m_nPoints; + ROOT::Math::Interpolator m_linInterpol; //! Do not persistify - ClassDefOverride(TFCSEnergyInterpolationPiecewiseLinear, 1) //TFCSEnergyInterpolationPiecewiseLinear + std::vector<Double_t> m_logEkin; + std::vector<Double_t> m_response; + std::pair<float, float> m_MinMaxlogEkin; + + ClassDefOverride(TFCSEnergyInterpolationPiecewiseLinear, 2) //TFCSEnergyInterpolationPiecewiseLinear }; diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationPiecewiseLinear.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationPiecewiseLinear.cxx index 59b0705c6c94532b35e21bd6212be23a0d08b889..7af71f2148092b03559e7cd13392065089f864ff 100644 --- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationPiecewiseLinear.cxx +++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSEnergyInterpolationPiecewiseLinear.cxx @@ -29,10 +29,15 @@ TFCSEnergyInterpolationPiecewiseLinear::TFCSEnergyInterpolationPiecewiseLinear(c void TFCSEnergyInterpolationPiecewiseLinear::InitFromArrayInLogEkin(Int_t np, const Double_t logEkin[], const Double_t response[]) { - m_linInterpol.SetData(np, logEkin, response); - m_minXValue = *std::min_element(logEkin, logEkin + np); - m_maxXValue = *std::max_element(logEkin, logEkin + np); - m_nPoints = np; + //save logEkin and response as std::vector class members + //this is required for using the custom streamer + m_logEkin.assign (logEkin, logEkin + np); + m_response.assign(response, response + np); + m_linInterpol.SetData(m_logEkin, m_response); + + auto min_max = std::minmax_element(m_logEkin.begin(), m_logEkin.end()); + m_MinMaxlogEkin = std::make_pair(*min_max.first, *min_max.second); + } void TFCSEnergyInterpolationPiecewiseLinear::InitFromArrayInEkin(Int_t np, const Double_t Ekin[], const Double_t response[]) @@ -52,11 +57,11 @@ FCSReturnCode TFCSEnergyInterpolationPiecewiseLinear::simulate(TFCSSimulationSta const float logEkin = Ekin > Gaudi::Units::keV ? TMath::Log(Ekin) : TMath::Log(Gaudi::Units::keV); float Emean; - if(logEkin < m_minXValue){ - Emean = m_linInterpol.Eval(m_minXValue)*Einit; + if(logEkin < m_MinMaxlogEkin.first){ + Emean = m_linInterpol.Eval(m_MinMaxlogEkin.first)*Einit; } - else if(logEkin > m_maxXValue){ - Emean = (m_linInterpol.Eval(m_maxXValue) + m_linInterpol.Deriv(m_maxXValue) * (logEkin - m_maxXValue))*Einit; + else if(logEkin > m_MinMaxlogEkin.second){ + Emean = (m_linInterpol.Eval(m_MinMaxlogEkin.second) + m_linInterpol.Deriv(m_MinMaxlogEkin.second) * (logEkin - m_MinMaxlogEkin.second))*Einit; } else{ Emean = m_linInterpol.Eval(logEkin)*Einit; @@ -73,6 +78,7 @@ FCSReturnCode TFCSEnergyInterpolationPiecewiseLinear::simulate(TFCSSimulationSta void TFCSEnergyInterpolationPiecewiseLinear::Print(Option_t *option) const { + TString opt(option); bool shortprint = opt.Index("short")>=0; bool longprint = msgLvl(MSG::DEBUG) || (msgLvl(MSG::INFO) && !shortprint); @@ -80,11 +86,25 @@ void TFCSEnergyInterpolationPiecewiseLinear::Print(Option_t *option) const optprint.ReplaceAll("short",""); TFCSParametrization::Print(option); - if(longprint) ATH_MSG_INFO(optprint <<(OnlyScaleEnergy()?" E()*":" Ekin()*")<<"linInterpol N="<<m_nPoints - <<" "<<m_minXValue<<"<=log(Ekin)<="<<m_maxXValue - <<" "<<TMath::Exp(m_minXValue)<<"<=Ekin<="<<TMath::Exp(m_maxXValue)); + if(longprint) ATH_MSG_INFO(optprint <<(OnlyScaleEnergy()?" E()*":" Ekin()*")<<"linInterpol N="<<m_logEkin.size() + <<" "<<m_MinMaxlogEkin.first<<"<=log(Ekin)<="<<m_MinMaxlogEkin.second + <<" "<<TMath::Exp(m_MinMaxlogEkin.first)<<"<=Ekin<="<<TMath::Exp(m_MinMaxlogEkin.second)); } +void TFCSEnergyInterpolationPiecewiseLinear::Streamer(TBuffer &R__b) +{ + //Stream an object of class TFCSEnergyInterpolationPiecewiseLinear + if (R__b.IsReading()) { + //read the class buffer + R__b.ReadClassBuffer(TFCSEnergyInterpolationPiecewiseLinear::Class(), this); + //initialize interpolation from saved class members + InitFromArrayInLogEkin(m_logEkin.size(), m_logEkin.data(), m_response.data()); + } + else { + R__b.WriteClassBuffer(TFCSEnergyInterpolationPiecewiseLinear::Class(), this); + } + +} void TFCSEnergyInterpolationPiecewiseLinear::unit_test(TFCSSimulationState* simulstate, TFCSTruthState* truth, const TFCSExtrapolationState* extrapol, TGraph* grlinear) {