ATLAS Offline Software
Loading...
Searching...
No Matches
ZDCFitExpFermiLinearPrePulse Class Reference

#include <ZDCFitWrapper.h>

Inheritance diagram for ZDCFitExpFermiLinearPrePulse:
Collaboration diagram for ZDCFitExpFermiLinearPrePulse:

Public Member Functions

 ZDCFitExpFermiLinearPrePulse (const std::string &tag, float tmin, float tmax, float tau1, float tau2)
 ~ZDCFitExpFermiLinearPrePulse ()
virtual void DoInitialize (float initialAmp, float initialT0, float ampMin, float ampMax) override
virtual void SetT0FitLimits (float tMin, float tMax) override
virtual void ConstrainFit () override
virtual void UnconstrainFit () override
virtual void SetInitialPrePulse (float amp, float t0, float, bool) override
virtual void SetPrePulseT0Range (float tmin, float tmax) override
virtual void SetPostPulseT0Range (float, float, float) override
unsigned int GetPreT0ParIndex () const override
virtual float GetAmplitude () const override
virtual float GetAmpError () const override
virtual float GetTau1 () const override
virtual float GetTau2 () const override
virtual float GetPreT0 () const override
virtual float GetPreAmp () const override
virtual float GetPostT0 () const override
virtual float GetPostAmp () const override
virtual float GetExpAmp () const override
virtual float GetTime () const override
virtual unsigned int GetNumShapeParameters () const override
virtual float GetShapeParameter (size_t index) const override
virtual float GetBkgdMaxFraction () const override
virtual double operator() (const double *x, const double *p) override
void Initialize (float initialAmp, float initialT0, float ampMin, float ampMax)
void Initialize (float initialAmp, float initialT0, float ampMin, float ampMax, float fitTmin, float fitTmax, float fitTRef)
void SetAmpMinMax (float minAmp, float maxAmp)
void SetT0Range (float t0Min, float t0Max)
float GetMinAmp () const
float GetMaxAmp () const
float GetTMin () const
float GetTMax () const
float GetT0Min () const
float GetT0Max () const
float GetTMinAdjust () const
virtual std::shared_ptr< TF1 > GetWrapperTF1 ()
virtual const TF1 * GetWrapperTF1 () const
virtual TF1 * GetWrapperTF1RawPtr () const

Protected Attributes

float m_preT0Min
float m_preT0Max

Private Attributes

float m_tau1 {}
float m_tau2 {}
float m_norm {}
float m_timeCorr {}
std::shared_ptr< TF1 > m_expFermiFunc
std::shared_ptr< TF1 > m_wrapperTF1 {}
float m_tmin {0}
float m_tmax {0}
float m_ampMin {0}
float m_ampMax {0}
float m_t0Min {0}
float m_t0Max {0}
bool m_adjTLimitsEvent {false}
float m_tminAdjust {0}
float m_tempTmin {0}
float m_tempTmax {0}

Detailed Description

Definition at line 1025 of file ZDCFitWrapper.h.

Constructor & Destructor Documentation

◆ ZDCFitExpFermiLinearPrePulse()

ZDCFitExpFermiLinearPrePulse::ZDCFitExpFermiLinearPrePulse ( const std::string & tag,
float tmin,
float tmax,
float tau1,
float tau2 )

Definition at line 929 of file ZDCFitWrapper.cxx.

929 :
930 ZDCPrePulseFitWrapper(std::make_shared<TF1>(("ExpFermiLinearPrePulse" + tag).c_str(), this, tmin, tmax, 6)),
931 m_tau1(tau1), m_tau2(tau2)
932{
933 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
934 //
935 std::string funcNameRefFunc = "ExpFermiPerPulseRefFunc" + tag;
936
937 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, -50, 100, 5);
938
939 m_expFermiFunc->SetParameter(0, 1);
940 m_expFermiFunc->SetParameter(1, 0);
941 m_expFermiFunc->SetParameter(2, m_tau1);
942 m_expFermiFunc->SetParameter(3, m_tau2);
943 m_expFermiFunc->FixParameter(4, 0);
944
945 m_norm = 1. / m_expFermiFunc->GetMaximum();
946 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
947
948 // Now set up the actual TF1
949 //
950 std::shared_ptr<TF1> theTF1 = ZDCFitWrapper::GetWrapperTF1();
951
952 theTF1->SetParName(0, "Amp");
953 theTF1->SetParName(1, "T0");
954 theTF1->SetParName(2, "Amp_{pre}");
955 theTF1->SetParName(3, "T0_{pre}");
956 theTF1->SetParName(4, "s_{b}");
957 theTF1->SetParName(5, "c_{b}");
958
959 // BAC, parameter 0 limits now is set in DoInitialize
960 theTF1->SetParLimits(1, tmin, tmax);
961 theTF1->SetParLimits(2, 1, 4096); // Increase the upper range to 4 times of ADC range to deal with large exponential tail case of pre-pulse.
962 theTF1->SetParLimits(3, -20, 10);
963}
double ZDCFermiExpFit(const double *xvec, const double *pvec)
std::shared_ptr< TF1 > m_expFermiFunc
virtual std::shared_ptr< TF1 > GetWrapperTF1()
ZDCPrePulseFitWrapper(std::shared_ptr< TF1 > wrapperTF1)

◆ ~ZDCFitExpFermiLinearPrePulse()

ZDCFitExpFermiLinearPrePulse::~ZDCFitExpFermiLinearPrePulse ( )
inline

Definition at line 1036 of file ZDCFitWrapper.h.

1036{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitExpFermiLinearPrePulse::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 965 of file ZDCFitWrapper.cxx.

966{
967 // We force the linear terms and prepulse terms to zero
968 //
969 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
970
971 theTF1->FixParameter(4, 0);
972 theTF1->FixParameter(5, 0);
973}

◆ DoInitialize()

void ZDCFitExpFermiLinearPrePulse::DoInitialize ( float initialAmp,
float initialT0,
float ampMin,
float ampMax )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 987 of file ZDCFitWrapper.cxx.

988{
989 float slope = std::abs(initialAmp / initialT0); // to be studied more ??? limit 0.1 0.05
990 float intercept = std::abs(0.5 * initialAmp);
991 GetWrapperTF1()->SetParLimits(4, -slope , slope );
992 GetWrapperTF1()->SetParLimits(5, -intercept, intercept);
993
994 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
995
996 GetWrapperTF1()->SetParameter(0, initialAmp);
997 GetWrapperTF1()->SetParameter(1, initialT0);
998 GetWrapperTF1()->SetParameter(2, 5);
999 GetWrapperTF1()->SetParameter(5, 0);
1000
1001 double ampStep = std::min(0.05*initialAmp, std::abs(ampMax - initialAmp)/2.);
1002
1003 GetWrapperTF1()->SetParError(0, ampStep);
1004 GetWrapperTF1()->SetParError(1, 1.0);
1005 GetWrapperTF1()->SetParError(2, 1);
1006 GetWrapperTF1()->SetParError(3, 1);
1007 GetWrapperTF1()->SetParError(4, 0.1);
1008 GetWrapperTF1()->SetParError(5, 1);
1009}

◆ GetAmpError()

virtual float ZDCFitExpFermiLinearPrePulse::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1055 of file ZDCFitWrapper.h.

1055{return GetWrapperTF1()->GetParError(0); }

◆ GetAmplitude()

virtual float ZDCFitExpFermiLinearPrePulse::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1054 of file ZDCFitWrapper.h.

1054{return GetWrapperTF1()->GetParameter(0); }

◆ GetBkgdMaxFraction()

virtual float ZDCFitExpFermiLinearPrePulse::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1088 of file ZDCFitWrapper.h.

1089 {
1090 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
1091
1092 double maxTime = GetTime();
1093
1094 double amp = theTF1->GetParameter(0);
1095 if (amp <= 0) return -1;
1096
1097 double preAmp = theTF1->GetParameter(2);
1098 double preT0 = theTF1->GetParameter(3);
1099 double slope = theTF1->GetParameter(4);
1100
1101 double deltaTPre = maxTime - preT0;
1102
1103 double background = slope * maxTime + preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) -
1104 m_expFermiFunc->operator()(-preT0));
1105
1106 return background / amp;
1107 }
virtual float GetTime() const override

◆ GetExpAmp()

virtual float ZDCFitExpFermiLinearPrePulse::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1074 of file ZDCFitWrapper.h.

1074{return 0;}

◆ GetMaxAmp()

float ZDCFitWrapper::GetMaxAmp ( ) const
inlineinherited

Definition at line 91 of file ZDCFitWrapper.h.

91{return m_ampMax;}

◆ GetMinAmp()

float ZDCFitWrapper::GetMinAmp ( ) const
inlineinherited

Definition at line 90 of file ZDCFitWrapper.h.

90{return m_ampMin;}

◆ GetNumShapeParameters()

virtual unsigned int ZDCFitExpFermiLinearPrePulse::GetNumShapeParameters ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1080 of file ZDCFitWrapper.h.

1080{return 1;}

◆ GetPostAmp()

virtual float ZDCFitExpFermiLinearPrePulse::GetPostAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1072 of file ZDCFitWrapper.h.

1072{return 0;}

◆ GetPostT0()

virtual float ZDCFitExpFermiLinearPrePulse::GetPostT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1071 of file ZDCFitWrapper.h.

1071{return 0;}

◆ GetPreAmp()

virtual float ZDCFitExpFermiLinearPrePulse::GetPreAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1069 of file ZDCFitWrapper.h.

1069{return GetWrapperTF1()->GetParameter(2);}

◆ GetPreT0()

virtual float ZDCFitExpFermiLinearPrePulse::GetPreT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1060 of file ZDCFitWrapper.h.

1060 {
1061 float fitPreT0 = GetWrapperTF1()->GetParameter(3);
1062
1063 // Correct the time to the maximum
1064 //
1065 fitPreT0 += m_timeCorr;
1066
1067 return fitPreT0;
1068 }

◆ GetPreT0ParIndex()

unsigned int ZDCFitExpFermiLinearPrePulse::GetPreT0ParIndex ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1052 of file ZDCFitWrapper.h.

1052{return 3;}

◆ GetShapeParameter()

virtual float ZDCFitExpFermiLinearPrePulse::GetShapeParameter ( size_t index) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1082 of file ZDCFitWrapper.h.

1083 {
1084 if (index < 1) return GetWrapperTF1()->GetParameter(index + 4);
1085 else throw std::runtime_error("Fit parameter does not exist.");
1086 }

◆ GetT0Max()

float ZDCFitWrapper::GetT0Max ( ) const
inlineinherited

Definition at line 101 of file ZDCFitWrapper.h.

101 {
102 if (m_adjTLimitsEvent) return m_tempTmax;
103 else return m_t0Max;
104 }

◆ GetT0Min()

float ZDCFitWrapper::GetT0Min ( ) const
inlineinherited

Definition at line 96 of file ZDCFitWrapper.h.

96 {
97 if (m_adjTLimitsEvent) return m_tempTmin;
98 else return m_t0Min;
99 }

◆ GetTau1()

virtual float ZDCFitExpFermiLinearPrePulse::GetTau1 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1057 of file ZDCFitWrapper.h.

1057{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitExpFermiLinearPrePulse::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1058 of file ZDCFitWrapper.h.

1058{return m_tau2;}

◆ GetTime()

virtual float ZDCFitExpFermiLinearPrePulse::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1076 of file ZDCFitWrapper.h.

1076 {
1077 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
1078 }

◆ GetTMax()

float ZDCFitWrapper::GetTMax ( ) const
inlineinherited

Definition at line 94 of file ZDCFitWrapper.h.

94{return m_tmax;}

◆ GetTMin()

float ZDCFitWrapper::GetTMin ( ) const
inlineinherited

Definition at line 93 of file ZDCFitWrapper.h.

93{return m_tmin;}

◆ GetTMinAdjust()

float ZDCFitWrapper::GetTMinAdjust ( ) const
inlineinherited

Definition at line 106 of file ZDCFitWrapper.h.

106{return m_tminAdjust;}

◆ GetWrapperTF1() [1/2]

virtual std::shared_ptr< TF1 > ZDCFitWrapper::GetWrapperTF1 ( )
inlinevirtualinherited

Definition at line 115 of file ZDCFitWrapper.h.

115{return m_wrapperTF1;}
std::shared_ptr< TF1 > m_wrapperTF1

◆ GetWrapperTF1() [2/2]

virtual const TF1 * ZDCFitWrapper::GetWrapperTF1 ( ) const
inlinevirtualinherited

Definition at line 116 of file ZDCFitWrapper.h.

116{return m_wrapperTF1.get();}

◆ GetWrapperTF1RawPtr()

virtual TF1 * ZDCFitWrapper::GetWrapperTF1RawPtr ( ) const
inlinevirtualinherited

Definition at line 117 of file ZDCFitWrapper.h.

117{return m_wrapperTF1.get();}

◆ Initialize() [1/2]

void ZDCFitWrapper::Initialize ( float initialAmp,
float initialT0,
float ampMin,
float ampMax )
inherited

Definition at line 9 of file ZDCFitWrapper.cxx.

10{
11 // Clear the errors on the TF1 because retaining the errors seems to affect
12 // the convergence of fits
13 //
14 unsigned int npar = GetWrapperTF1()->GetNpar();
15 std::vector<double> zeroVec(npar, 0.0);
16 GetWrapperTF1()->SetParErrors(&zeroVec[0]);
17
18 // If we adjusted the time range on the previous event, restore to default
19 //
22
23 m_adjTLimitsEvent = false;
24 m_tminAdjust = 0;
25 }
26
27 SetAmpMinMax(ampMin, ampMax);
28
29 DoInitialize(initialAmp, initialT0, ampMin, ampMax);
30}
virtual void SetT0FitLimits(float tMin, float tMax)=0
void SetAmpMinMax(float minAmp, float maxAmp)
virtual void DoInitialize(float initialAmp, float initialT0, float ampMin, float ampMax)=0

◆ Initialize() [2/2]

void ZDCFitWrapper::Initialize ( float initialAmp,
float initialT0,
float ampMin,
float ampMax,
float fitTmin,
float fitTmax,
float fitTRef )
inherited

Definition at line 32 of file ZDCFitWrapper.cxx.

33{
34 // Clear the errors on the TF1 because retaining the errors seems to affect
35 // the convergence of fits
36 //
37 unsigned int npar = GetWrapperTF1()->GetNpar();
38 std::vector<double> zeroVec(npar, 0.0);
39 GetWrapperTF1()->SetParErrors(&zeroVec[0]);
40
41 m_adjTLimitsEvent = true;
42
43 m_tminAdjust = fitTRef; // Note: this is the time corresponding to the sample used for presample subtraction
44
45 m_tempTmin = std::max(m_t0Min, fitTmin);
46 m_tempTmax = std::min(m_t0Max, fitTmax);
47
48 SetAmpMinMax(ampMin, ampMax);
50
51 DoInitialize(initialAmp, initialT0, ampMin, ampMax);
52}

◆ operator()()

virtual double ZDCFitExpFermiLinearPrePulse::operator() ( const double * x,
const double * p )
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1109 of file ZDCFitWrapper.h.

1110 {
1111 double t = x[0];
1112
1113 double amp = p[0];
1114 double t0 = p[1];
1115 double preAmp = p[2];
1116 double preT0 = p[3];
1117 double linSlope = p[4];
1118
1119 double deltaT = t - t0;
1120 double deltaTPre = t - preT0;
1121
1122 // We subtract off the value of the pre-pulse at the minimum time (nominally 0,
1123 // but can change if we exclude early samples) to account for the subtraction of the pre-sample
1124 //
1125 double deltaPresamp = GetTMinAdjust() - preT0;
1126
1127 double pulse1 = amp * m_norm * m_expFermiFunc->operator()(deltaT);
1128 double pulse2 = preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) -
1129 m_expFermiFunc->operator()(deltaPresamp));
1130
1131 double bckgd = linSlope * (t - deltaPresamp) + p[5];
1132
1133 return pulse1 + pulse2 + bckgd;
1134 }
static Double_t t0
#define x
float GetTMinAdjust() const

◆ SetAmpMinMax()

void ZDCFitWrapper::SetAmpMinMax ( float minAmp,
float maxAmp )
inlineinherited

Definition at line 67 of file ZDCFitWrapper.h.

68 {
69 m_ampMin = minAmp;
70 m_ampMax = maxAmp;
71 }

◆ SetInitialPrePulse()

virtual void ZDCFitExpFermiLinearPrePulse::SetInitialPrePulse ( float amp,
float t0,
float ,
bool  )
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1044 of file ZDCFitWrapper.h.

1044 {
1045 GetWrapperTF1()->SetParameter(2, std::max(amp, (float) 1.5)); //1.5 here ensures that we're above lower limit
1046 GetWrapperTF1()->SetParameter(3, t0);
1047 }

◆ SetPostPulseT0Range()

virtual void ZDCFitExpFermiLinearPrePulse::SetPostPulseT0Range ( float ,
float ,
float  )
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1050 of file ZDCFitWrapper.h.

1050{return;}

◆ SetPrePulseT0Range()

void ZDCFitExpFermiLinearPrePulse::SetPrePulseT0Range ( float tmin,
float tmax )
overridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 982 of file ZDCFitWrapper.cxx.

983{
984 GetWrapperTF1()->SetParLimits(3, tmin, tmax);
985}

◆ SetT0FitLimits()

void ZDCFitExpFermiLinearPrePulse::SetT0FitLimits ( float tMin,
float tMax )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 1011 of file ZDCFitWrapper.cxx.

1012{
1013 GetWrapperTF1()->SetParLimits(1, t0Min, t0Max);
1014}

◆ SetT0Range()

void ZDCFitWrapper::SetT0Range ( float t0Min,
float t0Max )
inlineinherited

Definition at line 73 of file ZDCFitWrapper.h.

74 {
75 m_t0Min = t0Min;
76 m_t0Max = t0Max;
77
78 SetT0FitLimits(t0Min, t0Max);
79 }

◆ UnconstrainFit()

void ZDCFitExpFermiLinearPrePulse::UnconstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 974 of file ZDCFitWrapper.cxx.

975{
976 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
977
978 theTF1->ReleaseParameter(4);
979 theTF1->ReleaseParameter(5);
980}

Member Data Documentation

◆ m_adjTLimitsEvent

bool ZDCFitWrapper::m_adjTLimitsEvent {false}
privateinherited

Definition at line 36 of file ZDCFitWrapper.h.

36{false};

◆ m_ampMax

float ZDCFitWrapper::m_ampMax {0}
privateinherited

Definition at line 31 of file ZDCFitWrapper.h.

31{0};

◆ m_ampMin

float ZDCFitWrapper::m_ampMin {0}
privateinherited

Definition at line 30 of file ZDCFitWrapper.h.

30{0};

◆ m_expFermiFunc

std::shared_ptr<TF1> ZDCFitExpFermiLinearPrePulse::m_expFermiFunc
private

Definition at line 1032 of file ZDCFitWrapper.h.

◆ m_norm

float ZDCFitExpFermiLinearPrePulse::m_norm {}
private

Definition at line 1030 of file ZDCFitWrapper.h.

1030{};

◆ m_preT0Max

float ZDCPrePulseFitWrapper::m_preT0Max
protectedinherited

Definition at line 124 of file ZDCFitWrapper.h.

◆ m_preT0Min

float ZDCPrePulseFitWrapper::m_preT0Min
protectedinherited

Definition at line 123 of file ZDCFitWrapper.h.

◆ m_t0Max

float ZDCFitWrapper::m_t0Max {0}
privateinherited

Definition at line 34 of file ZDCFitWrapper.h.

34{0};

◆ m_t0Min

float ZDCFitWrapper::m_t0Min {0}
privateinherited

Definition at line 33 of file ZDCFitWrapper.h.

33{0};

◆ m_tau1

float ZDCFitExpFermiLinearPrePulse::m_tau1 {}
private

Definition at line 1028 of file ZDCFitWrapper.h.

1028{};

◆ m_tau2

float ZDCFitExpFermiLinearPrePulse::m_tau2 {}
private

Definition at line 1029 of file ZDCFitWrapper.h.

1029{};

◆ m_tempTmax

float ZDCFitWrapper::m_tempTmax {0}
privateinherited

Definition at line 39 of file ZDCFitWrapper.h.

39{0};

◆ m_tempTmin

float ZDCFitWrapper::m_tempTmin {0}
privateinherited

Definition at line 38 of file ZDCFitWrapper.h.

38{0};

◆ m_timeCorr

float ZDCFitExpFermiLinearPrePulse::m_timeCorr {}
private

Definition at line 1031 of file ZDCFitWrapper.h.

1031{};

◆ m_tmax

float ZDCFitWrapper::m_tmax {0}
privateinherited

Definition at line 28 of file ZDCFitWrapper.h.

28{0};

◆ m_tmin

float ZDCFitWrapper::m_tmin {0}
privateinherited

Definition at line 27 of file ZDCFitWrapper.h.

27{0};

◆ m_tminAdjust

float ZDCFitWrapper::m_tminAdjust {0}
privateinherited

Definition at line 37 of file ZDCFitWrapper.h.

37{0};

◆ m_wrapperTF1

std::shared_ptr<TF1> ZDCFitWrapper::m_wrapperTF1 {}
privateinherited

Definition at line 25 of file ZDCFitWrapper.h.

25{};

The documentation for this class was generated from the following files: