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

#include <ZDCFitWrapper.h>

Inheritance diagram for ZDCFitComplexPrePulse:
Collaboration diagram for ZDCFitComplexPrePulse:

Public Member Functions

 ZDCFitComplexPrePulse (const std::string &tag, float tmin, float tmax, float tau1, float tau2)
 ~ZDCFitComplexPrePulse ()
virtual void DoInitialize (float initialAmp, float initialT0, float ampMin, float ampMax) override
virtual void SetT0FitLimits (float tMin, float tMax) override
virtual void SetInitialPrePulse (float amp, float t0, float expamp, bool) override
virtual void ConstrainFit () override
virtual void UnconstrainFit () 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 1140 of file ZDCFitWrapper.h.

Constructor & Destructor Documentation

◆ ZDCFitComplexPrePulse()

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

Definition at line 1019 of file ZDCFitWrapper.cxx.

1019 :
1020 ZDCPrePulseFitWrapper(std::make_shared<TF1>(("ExpFermiPrePulse" + tag).c_str(), this, tmin, tmax, 7)),
1021 m_tau1(tau1), m_tau2(tau2)
1022{
1023 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
1024 //
1025 std::string funcNameRefFunc = "ExpFermiPerPulseRefFunc" + tag;
1026
1027 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, -50, 100, 4);
1028
1029 m_expFermiFunc->SetParameter(0, 1);
1030 m_expFermiFunc->SetParameter(1, 0);
1031 m_expFermiFunc->SetParameter(2, m_tau1);
1032 m_expFermiFunc->SetParameter(3, m_tau2);
1033
1034 m_norm = 1. / m_expFermiFunc->GetMaximum();
1035 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
1036
1037 // Now set up the actual TF1
1038 //
1039 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
1040
1041 // BAC, parameter 0 limits now is set in DoInitialize
1042 theTF1->SetParLimits(1, tmin, tmax);
1043 theTF1->SetParLimits(2, 0, 2048); // Pre-pulse upper bound should not be greater 2 times of ADC range with overflow constrains.
1044 theTF1->SetParLimits(3, 0, 40);
1045 theTF1->SetParLimits(6, 0, 4096); // Increase the upper range to 4 times of ADC range to deal with large exponential tail case of pre-pulse.
1046
1047 theTF1->SetParName(0, "Amp");
1048 theTF1->SetParName(1, "T0");
1049 theTF1->SetParName(2, "Amp_{pre}");
1050 theTF1->SetParName(3, "T0_{pre}");
1051 theTF1->SetParName(4, "s_{b}");
1052 theTF1->SetParName(5, "c_{b}");
1053 theTF1->SetParName(6, "Amp_{exp}");
1054}
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)

◆ ~ZDCFitComplexPrePulse()

ZDCFitComplexPrePulse::~ZDCFitComplexPrePulse ( )
inline

Definition at line 1151 of file ZDCFitWrapper.h.

1151{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitComplexPrePulse::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 1056 of file ZDCFitWrapper.cxx.

1057{
1058 // We force the linear terms and prepulse terms to zero
1059 //
1060 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
1061
1062 theTF1->FixParameter(2, 0);
1063 theTF1->FixParameter(4, 0);
1064 theTF1->FixParameter(5, 0);
1065}

◆ DoInitialize()

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

Implements ZDCFitWrapper.

Definition at line 1085 of file ZDCFitWrapper.cxx.

1086{
1087 float slope = std::abs(initialAmp / initialT0); // to be studied more ??? limit 0.1 0.05
1088 float intercept = std::abs(0.1 * initialAmp); // reduce from 0.25 to 0.1 fix some fail issue
1089 GetWrapperTF1()->SetParLimits(4, -slope , slope ); // if the lower limit is set to 0, there will be some fit fail issue...
1090 GetWrapperTF1()->SetParLimits(5, -intercept, intercept);
1091
1092 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
1093
1094 GetWrapperTF1()->SetParameter(0, initialAmp);
1095 GetWrapperTF1()->SetParameter(1, initialT0);
1096 GetWrapperTF1()->SetParameter(2, 5);
1097 GetWrapperTF1()->SetParameter(3, 10);
1098 GetWrapperTF1()->SetParameter(4, 0);
1099 GetWrapperTF1()->SetParameter(5, 0);
1100 GetWrapperTF1()->SetParameter(6, 1);
1101}

◆ GetAmpError()

virtual float ZDCFitComplexPrePulse::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1171 of file ZDCFitWrapper.h.

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

◆ GetAmplitude()

virtual float ZDCFitComplexPrePulse::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1170 of file ZDCFitWrapper.h.

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

◆ GetBkgdMaxFraction()

virtual float ZDCFitComplexPrePulse::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1204 of file ZDCFitWrapper.h.

1205 {
1206 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
1207
1208 double maxTime = GetTime();
1209
1210 double amp = theTF1->GetParameter(0);
1211 if (amp <= 0) return -1;
1212
1213 double preAmp = theTF1->GetParameter(2);
1214 double preT0 = theTF1->GetParameter(3);
1215 double slope = theTF1->GetParameter(4);
1216
1217 double deltaTPre = maxTime - preT0;
1218
1219 double background = slope * maxTime + preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) -
1220 m_expFermiFunc->operator()(-preT0));
1221
1222 return background / amp;
1223 }
virtual float GetTime() const override

◆ GetExpAmp()

virtual float ZDCFitComplexPrePulse::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1190 of file ZDCFitWrapper.h.

1190{return GetWrapperTF1()->GetParameter(6);}

◆ 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 ZDCFitComplexPrePulse::GetNumShapeParameters ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1196 of file ZDCFitWrapper.h.

1196{return 3;}

◆ GetPostAmp()

virtual float ZDCFitComplexPrePulse::GetPostAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1188 of file ZDCFitWrapper.h.

1188{return 0;}

◆ GetPostT0()

virtual float ZDCFitComplexPrePulse::GetPostT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1187 of file ZDCFitWrapper.h.

1187{return 0;}

◆ GetPreAmp()

virtual float ZDCFitComplexPrePulse::GetPreAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1185 of file ZDCFitWrapper.h.

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

◆ GetPreT0()

virtual float ZDCFitComplexPrePulse::GetPreT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1176 of file ZDCFitWrapper.h.

1176 {
1177 float fitPreT0 = GetWrapperTF1()->GetParameter(3);
1178
1179 // Correct the time to the maximum
1180 //
1181 fitPreT0 += m_timeCorr;
1182
1183 return fitPreT0;
1184 }

◆ GetPreT0ParIndex()

unsigned int ZDCFitComplexPrePulse::GetPreT0ParIndex ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1168 of file ZDCFitWrapper.h.

1168{return 3;}

◆ GetShapeParameter()

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

Implements ZDCFitWrapper.

Definition at line 1198 of file ZDCFitWrapper.h.

1199 {
1200 if (index < 3) return GetWrapperTF1()->GetParameter(4 + index);
1201 else throw std::runtime_error("Fit parameter does not exist.");
1202 }

◆ 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 ZDCFitComplexPrePulse::GetTau1 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1173 of file ZDCFitWrapper.h.

1173{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitComplexPrePulse::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1174 of file ZDCFitWrapper.h.

1174{return m_tau2;}

◆ GetTime()

virtual float ZDCFitComplexPrePulse::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1192 of file ZDCFitWrapper.h.

1192 {
1193 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
1194 }

◆ 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 ZDCFitComplexPrePulse::operator() ( const double * x,
const double * p )
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1225 of file ZDCFitWrapper.h.

1226 {
1227 double t = x[0];
1228
1229 double amp = p[0];
1230 double t0 = p[1];
1231 double preAmp = p[2];
1232 double preT0 = p[3];
1233 double linSlope = p[4];
1234 double linConst = p[5];
1235 double expamp = p[6];
1236
1237 double deltaT = t - t0;
1238 double deltaTPre = t - preT0;
1239
1240 // We subtract off the value of the pre-pulse at the minimum time (nominally 0,
1241 // but can change if we exclude early samples) to account for the subtraction of the pre-sample
1242 //
1243 double deltaPresamp = GetTMinAdjust() - preT0;
1244
1245 double pulse1 = amp * m_norm * m_expFermiFunc->operator()(deltaT);
1246 double pulse2 = preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) - m_expFermiFunc->operator()(deltaPresamp));
1247
1248 double linBG = linSlope * (t - deltaPresamp) + linConst;
1249 double expBG = expamp * std::exp(-(t) / m_tau2) - expamp; // deltaPresamp
1250
1251 return pulse1 + pulse2 + linBG + expBG;
1252 }
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 ZDCFitComplexPrePulse::SetInitialPrePulse ( float amp,
float t0,
float expamp,
bool  )
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1156 of file ZDCFitWrapper.h.

1156 {
1157 GetWrapperTF1()->SetParameter(2, std::max(amp, (float) 1.5)); //1.5 here ensures that we're above lower limit
1158 GetWrapperTF1()->SetParameter(3, t0);
1159 GetWrapperTF1()->SetParameter(6, std::max(std::abs(expamp), (float) 1.5));
1160 }

◆ SetPostPulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 1166 of file ZDCFitWrapper.h.

1166{return;}

◆ SetPrePulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 1074 of file ZDCFitWrapper.cxx.

1075{
1076 if (tmin > GetTMin()) {
1077 GetWrapperTF1()->ReleaseParameter(3);
1078 GetWrapperTF1()->SetParLimits(3, tmin, tmax);
1079 }
1080 else {
1081 GetWrapperTF1()->SetParLimits(3, 0, tmax);
1082 }
1083}
float GetTMin() const

◆ SetT0FitLimits()

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

Implements ZDCFitWrapper.

Definition at line 1103 of file ZDCFitWrapper.cxx.

1104{
1105 GetWrapperTF1()->SetParLimits(1, t0Min, t0Max);
1106}

◆ 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 ZDCFitComplexPrePulse::UnconstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 1066 of file ZDCFitWrapper.cxx.

1067{
1068 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
1069 theTF1->ReleaseParameter(2);
1070 theTF1->ReleaseParameter(4);
1071 theTF1->ReleaseParameter(5);
1072}

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> ZDCFitComplexPrePulse::m_expFermiFunc
private

Definition at line 1147 of file ZDCFitWrapper.h.

◆ m_norm

float ZDCFitComplexPrePulse::m_norm {}
private

Definition at line 1145 of file ZDCFitWrapper.h.

1145{};

◆ 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 ZDCFitComplexPrePulse::m_tau1 {}
private

Definition at line 1143 of file ZDCFitWrapper.h.

1143{};

◆ m_tau2

float ZDCFitComplexPrePulse::m_tau2 {}
private

Definition at line 1144 of file ZDCFitWrapper.h.

1144{};

◆ 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 ZDCFitComplexPrePulse::m_timeCorr {}
private

Definition at line 1146 of file ZDCFitWrapper.h.

1146{};

◆ 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: