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 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 962 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 850 of file ZDCFitWrapper.cxx.

850 :
851 ZDCPrePulseFitWrapper(std::make_shared<TF1>(("ExpFermiPrePulse" + tag).c_str(), this, tmin, tmax, 7)),
852 m_tau1(tau1), m_tau2(tau2)
853{
854 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
855 //
856 std::string funcNameRefFunc = "ExpFermiPerPulseRefFunc" + tag;
857
858 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, -50, 100, 4);
859
860 m_expFermiFunc->SetParameter(0, 1);
861 m_expFermiFunc->SetParameter(1, 0);
862 m_expFermiFunc->SetParameter(2, m_tau1);
863 m_expFermiFunc->SetParameter(3, m_tau2);
864
865 m_norm = 1. / m_expFermiFunc->GetMaximum();
866 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
867
868 // Now set up the actual TF1
869 //
870 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
871
872 // BAC, parameter 0 limits now is set in DoInitialize
873 theTF1->SetParLimits(1, tmin, tmax);
874 theTF1->SetParLimits(2, 0, 2048); // Pre-pulse upper bound should not be greater 2 times of ADC range with overflow constrains.
875 theTF1->SetParLimits(3, 0, 40);
876 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.
877
878 theTF1->SetParName(0, "Amp");
879 theTF1->SetParName(1, "T0");
880 theTF1->SetParName(2, "Amp_{pre}");
881 theTF1->SetParName(3, "T0_{pre}");
882 theTF1->SetParName(4, "s_{b}");
883 theTF1->SetParName(5, "c_{b}");
884 theTF1->SetParName(6, "Amp_{exp}");
885}
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 973 of file ZDCFitWrapper.h.

973{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitComplexPrePulse::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 887 of file ZDCFitWrapper.cxx.

888{
889 // We force the linear terms and prepulse terms to zero
890 //
891 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
892
893 theTF1->FixParameter(2, 0);
894 theTF1->FixParameter(4, 0);
895 theTF1->FixParameter(5, 0);
896}

◆ DoInitialize()

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

Implements ZDCFitWrapper.

Definition at line 916 of file ZDCFitWrapper.cxx.

917{
918 float slope = std::abs(initialAmp / initialT0); // to be studied more ??? limit 0.1 0.05
919 float intercept = std::abs(0.1 * initialAmp); // reduce from 0.25 to 0.1 fix some fail issue
920 GetWrapperTF1()->SetParLimits(4, -slope , slope ); // if the lower limit is set to 0, there will be some fit fail issue...
921 GetWrapperTF1()->SetParLimits(5, -intercept, intercept);
922
923 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
924
925 GetWrapperTF1()->SetParameter(0, initialAmp);
926 GetWrapperTF1()->SetParameter(1, initialT0);
927 GetWrapperTF1()->SetParameter(2, 5);
928 GetWrapperTF1()->SetParameter(3, 10);
929 GetWrapperTF1()->SetParameter(4, 0);
930 GetWrapperTF1()->SetParameter(5, 0);
931 GetWrapperTF1()->SetParameter(6, 1);
932}

◆ GetAmpError()

virtual float ZDCFitComplexPrePulse::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 993 of file ZDCFitWrapper.h.

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

◆ GetAmplitude()

virtual float ZDCFitComplexPrePulse::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 992 of file ZDCFitWrapper.h.

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

◆ GetBkgdMaxFraction()

virtual float ZDCFitComplexPrePulse::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1026 of file ZDCFitWrapper.h.

1027 {
1028 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
1029
1030 double maxTime = GetTime();
1031
1032 double amp = theTF1->GetParameter(0);
1033 double preAmp = theTF1->GetParameter(2);
1034 double preT0 = theTF1->GetParameter(3);
1035 double slope = theTF1->GetParameter(4);
1036
1037 double deltaTPre = maxTime - preT0;
1038
1039 double background = slope * maxTime + preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) -
1040 m_expFermiFunc->operator()(-preT0));
1041
1042 return background / amp;
1043 }
virtual float GetTime() const override

◆ GetExpAmp()

virtual float ZDCFitComplexPrePulse::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1012 of file ZDCFitWrapper.h.

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

◆ GetMaxAmp()

float ZDCFitWrapper::GetMaxAmp ( ) const
inlineinherited

Definition at line 87 of file ZDCFitWrapper.h.

87{return m_ampMax;}

◆ GetMinAmp()

float ZDCFitWrapper::GetMinAmp ( ) const
inlineinherited

Definition at line 86 of file ZDCFitWrapper.h.

86{return m_ampMin;}

◆ GetPostAmp()

virtual float ZDCFitComplexPrePulse::GetPostAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1010 of file ZDCFitWrapper.h.

1010{return 0;}

◆ GetPostT0()

virtual float ZDCFitComplexPrePulse::GetPostT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1009 of file ZDCFitWrapper.h.

1009{return 0;}

◆ GetPreAmp()

virtual float ZDCFitComplexPrePulse::GetPreAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 1007 of file ZDCFitWrapper.h.

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

◆ GetPreT0()

virtual float ZDCFitComplexPrePulse::GetPreT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 998 of file ZDCFitWrapper.h.

998 {
999 float fitPreT0 = GetWrapperTF1()->GetParameter(3);
1000
1001 // Correct the time to the maximum
1002 //
1003 fitPreT0 += m_timeCorr;
1004
1005 return fitPreT0;
1006 }

◆ GetPreT0ParIndex()

unsigned int ZDCFitComplexPrePulse::GetPreT0ParIndex ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 990 of file ZDCFitWrapper.h.

990{return 3;}

◆ GetShapeParameter()

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

Implements ZDCFitWrapper.

Definition at line 1018 of file ZDCFitWrapper.h.

1019 {
1020 if (index == 0) return m_tau1;
1021 else if (index == 1) return m_tau2;
1022 else if (index < 5) return GetWrapperTF1()->GetParameter(index);
1023 else throw std::runtime_error("Fit parameter does not exist.");
1024 }

◆ GetT0Max()

float ZDCFitWrapper::GetT0Max ( ) const
inlineinherited

Definition at line 97 of file ZDCFitWrapper.h.

97 {
98 if (m_adjTLimitsEvent) return m_tempTmax;
99 else return m_t0Max;
100 }

◆ GetT0Min()

float ZDCFitWrapper::GetT0Min ( ) const
inlineinherited

Definition at line 92 of file ZDCFitWrapper.h.

92 {
93 if (m_adjTLimitsEvent) return m_tempTmin;
94 else return m_t0Min;
95 }

◆ GetTau1()

virtual float ZDCFitComplexPrePulse::GetTau1 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 995 of file ZDCFitWrapper.h.

995{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitComplexPrePulse::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 996 of file ZDCFitWrapper.h.

996{return m_tau2;}

◆ GetTime()

virtual float ZDCFitComplexPrePulse::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 1014 of file ZDCFitWrapper.h.

1014 {
1015 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
1016 }

◆ GetTMax()

float ZDCFitWrapper::GetTMax ( ) const
inlineinherited

Definition at line 90 of file ZDCFitWrapper.h.

90{return m_tmax;}

◆ GetTMin()

float ZDCFitWrapper::GetTMin ( ) const
inlineinherited

Definition at line 89 of file ZDCFitWrapper.h.

89{return m_tmin;}

◆ GetTMinAdjust()

float ZDCFitWrapper::GetTMinAdjust ( ) const
inlineinherited

Definition at line 102 of file ZDCFitWrapper.h.

102{return m_tminAdjust;}

◆ GetWrapperTF1() [1/2]

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

Definition at line 110 of file ZDCFitWrapper.h.

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

◆ GetWrapperTF1() [2/2]

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

Definition at line 111 of file ZDCFitWrapper.h.

111{return m_wrapperTF1.get();}

◆ GetWrapperTF1RawPtr()

virtual TF1 * ZDCFitWrapper::GetWrapperTF1RawPtr ( ) const
inlinevirtualinherited

Definition at line 112 of file ZDCFitWrapper.h.

112{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 1045 of file ZDCFitWrapper.h.

1046 {
1047 double t = x[0];
1048
1049 double amp = p[0];
1050 double t0 = p[1];
1051 double preAmp = p[2];
1052 double preT0 = p[3];
1053 double linSlope = p[4];
1054 double linConst = p[5];
1055 double expamp = p[6];
1056
1057 double deltaT = t - t0;
1058 double deltaTPre = t - preT0;
1059
1060 // We subtract off the value of the pre-pulse at the minimum time (nominally 0,
1061 // but can change if we exclude early samples) to account for the subtraction of the pre-sample
1062 //
1063 double deltaPresamp = GetTMinAdjust() - preT0;
1064
1065 double pulse1 = amp * m_norm * m_expFermiFunc->operator()(deltaT);
1066 double pulse2 = preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) - m_expFermiFunc->operator()(deltaPresamp));
1067
1068 double linBG = linSlope * (t - deltaPresamp) + linConst;
1069 double expBG = expamp * std::exp(-(t) / m_tau2) - expamp; // deltaPresamp
1070
1071 return pulse1 + pulse2 + linBG + expBG;
1072 }
static Double_t t0
#define x
float GetTMinAdjust() const

◆ SetAmpMinMax()

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

Definition at line 63 of file ZDCFitWrapper.h.

64 {
65 m_ampMin = minAmp;
66 m_ampMax = maxAmp;
67 }

◆ SetInitialPrePulse()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 978 of file ZDCFitWrapper.h.

978 {
979 GetWrapperTF1()->SetParameter(2, std::max(amp, (float) 1.5)); //1.5 here ensures that we're above lower limit
980 GetWrapperTF1()->SetParameter(3, t0);
981 GetWrapperTF1()->SetParameter(6, std::max(std::abs(expamp), (float) 1.5));
982 }

◆ SetPostPulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 988 of file ZDCFitWrapper.h.

988{return;}

◆ SetPrePulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 905 of file ZDCFitWrapper.cxx.

906{
907 if (tmin > GetTMin()) {
908 GetWrapperTF1()->ReleaseParameter(3);
909 GetWrapperTF1()->SetParLimits(3, tmin, tmax);
910 }
911 else {
912 GetWrapperTF1()->SetParLimits(3, 0, tmax);
913 }
914}
float GetTMin() const

◆ SetT0FitLimits()

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

Implements ZDCFitWrapper.

Definition at line 934 of file ZDCFitWrapper.cxx.

935{
936 GetWrapperTF1()->SetParLimits(1, t0Min, t0Max);
937}

◆ SetT0Range()

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

Definition at line 69 of file ZDCFitWrapper.h.

70 {
71 m_t0Min = t0Min;
72 m_t0Max = t0Max;
73
74 SetT0FitLimits(t0Min, t0Max);
75 }

◆ UnconstrainFit()

void ZDCFitComplexPrePulse::UnconstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 897 of file ZDCFitWrapper.cxx.

898{
899 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
900 theTF1->ReleaseParameter(2);
901 theTF1->ReleaseParameter(4);
902 theTF1->ReleaseParameter(5);
903}

Member Data Documentation

◆ m_adjTLimitsEvent

bool ZDCFitWrapper::m_adjTLimitsEvent {false}
privateinherited

Definition at line 32 of file ZDCFitWrapper.h.

32{false};

◆ m_ampMax

float ZDCFitWrapper::m_ampMax {0}
privateinherited

Definition at line 27 of file ZDCFitWrapper.h.

27{0};

◆ m_ampMin

float ZDCFitWrapper::m_ampMin {0}
privateinherited

Definition at line 26 of file ZDCFitWrapper.h.

26{0};

◆ m_expFermiFunc

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

Definition at line 969 of file ZDCFitWrapper.h.

◆ m_norm

float ZDCFitComplexPrePulse::m_norm
private

Definition at line 967 of file ZDCFitWrapper.h.

◆ m_preT0Max

float ZDCPrePulseFitWrapper::m_preT0Max
protectedinherited

Definition at line 119 of file ZDCFitWrapper.h.

◆ m_preT0Min

float ZDCPrePulseFitWrapper::m_preT0Min
protectedinherited

Definition at line 118 of file ZDCFitWrapper.h.

◆ m_t0Max

float ZDCFitWrapper::m_t0Max {0}
privateinherited

Definition at line 30 of file ZDCFitWrapper.h.

30{0};

◆ m_t0Min

float ZDCFitWrapper::m_t0Min {0}
privateinherited

Definition at line 29 of file ZDCFitWrapper.h.

29{0};

◆ m_tau1

float ZDCFitComplexPrePulse::m_tau1
private

Definition at line 965 of file ZDCFitWrapper.h.

◆ m_tau2

float ZDCFitComplexPrePulse::m_tau2
private

Definition at line 966 of file ZDCFitWrapper.h.

◆ m_tempTmax

float ZDCFitWrapper::m_tempTmax {0}
privateinherited

Definition at line 35 of file ZDCFitWrapper.h.

35{0};

◆ m_tempTmin

float ZDCFitWrapper::m_tempTmin {0}
privateinherited

Definition at line 34 of file ZDCFitWrapper.h.

34{0};

◆ m_timeCorr

float ZDCFitComplexPrePulse::m_timeCorr
private

Definition at line 968 of file ZDCFitWrapper.h.

◆ m_tmax

float ZDCFitWrapper::m_tmax {0}
privateinherited

Definition at line 24 of file ZDCFitWrapper.h.

24{0};

◆ m_tmin

float ZDCFitWrapper::m_tmin {0}
privateinherited

Definition at line 23 of file ZDCFitWrapper.h.

23{0};

◆ m_tminAdjust

float ZDCFitWrapper::m_tminAdjust {0}
privateinherited

Definition at line 33 of file ZDCFitWrapper.h.

33{0};

◆ m_wrapperTF1

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

Definition at line 21 of file ZDCFitWrapper.h.

21{};

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