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 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 849 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 760 of file ZDCFitWrapper.cxx.

760 :
761 ZDCPrePulseFitWrapper(std::make_shared<TF1>(("ExpFermiLinearPrePulse" + tag).c_str(), this, tmin, tmax, 6)),
762 m_tau1(tau1), m_tau2(tau2)
763{
764 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
765 //
766 std::string funcNameRefFunc = "ExpFermiPerPulseRefFunc" + tag;
767
768 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, -50, 100, 5);
769
770 m_expFermiFunc->SetParameter(0, 1);
771 m_expFermiFunc->SetParameter(1, 0);
772 m_expFermiFunc->SetParameter(2, m_tau1);
773 m_expFermiFunc->SetParameter(3, m_tau2);
774 m_expFermiFunc->FixParameter(4, 0);
775
776 m_norm = 1. / m_expFermiFunc->GetMaximum();
777 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
778
779 // Now set up the actual TF1
780 //
781 std::shared_ptr<TF1> theTF1 = ZDCFitWrapper::GetWrapperTF1();
782
783 theTF1->SetParName(0, "Amp");
784 theTF1->SetParName(1, "T0");
785 theTF1->SetParName(2, "Amp_{pre}");
786 theTF1->SetParName(3, "T0_{pre}");
787 theTF1->SetParName(4, "s_{b}");
788 theTF1->SetParName(5, "c_{b}");
789
790 // BAC, parameter 0 limits now is set in DoInitialize
791 theTF1->SetParLimits(1, tmin, tmax);
792 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.
793 theTF1->SetParLimits(3, -20, 10);
794}
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 860 of file ZDCFitWrapper.h.

860{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitExpFermiLinearPrePulse::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 796 of file ZDCFitWrapper.cxx.

797{
798 // We force the linear terms and prepulse terms to zero
799 //
800 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
801
802 theTF1->FixParameter(4, 0);
803 theTF1->FixParameter(5, 0);
804}

◆ DoInitialize()

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

Implements ZDCFitWrapper.

Definition at line 818 of file ZDCFitWrapper.cxx.

819{
820 float slope = std::abs(initialAmp / initialT0); // to be studied more ??? limit 0.1 0.05
821 float intercept = std::abs(0.5 * initialAmp);
822 GetWrapperTF1()->SetParLimits(4, -slope , slope );
823 GetWrapperTF1()->SetParLimits(5, -intercept, intercept);
824
825 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
826
827 GetWrapperTF1()->SetParameter(0, initialAmp);
828 GetWrapperTF1()->SetParameter(1, initialT0);
829 GetWrapperTF1()->SetParameter(2, 5);
830 GetWrapperTF1()->SetParameter(5, 0);
831
832 double ampStep = std::min(0.05*initialAmp, std::abs(ampMax - initialAmp)/2.);
833
834 GetWrapperTF1()->SetParError(0, ampStep);
835 GetWrapperTF1()->SetParError(1, 1.0);
836 GetWrapperTF1()->SetParError(2, 1);
837 GetWrapperTF1()->SetParError(3, 1);
838 GetWrapperTF1()->SetParError(4, 0.1);
839 GetWrapperTF1()->SetParError(5, 1);
840}

◆ GetAmpError()

virtual float ZDCFitExpFermiLinearPrePulse::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 879 of file ZDCFitWrapper.h.

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

◆ GetAmplitude()

virtual float ZDCFitExpFermiLinearPrePulse::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 878 of file ZDCFitWrapper.h.

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

◆ GetBkgdMaxFraction()

virtual float ZDCFitExpFermiLinearPrePulse::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 912 of file ZDCFitWrapper.h.

913 {
914 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
915
916 double maxTime = GetTime();
917
918 double amp = theTF1->GetParameter(0);
919 double preAmp = theTF1->GetParameter(2);
920 double preT0 = theTF1->GetParameter(3);
921 double slope = theTF1->GetParameter(4);
922
923 double deltaTPre = maxTime - preT0;
924
925 double background = slope * maxTime + preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) -
926 m_expFermiFunc->operator()(-preT0));
927
928 return background / amp;
929 }
virtual float GetTime() const override

◆ GetExpAmp()

virtual float ZDCFitExpFermiLinearPrePulse::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 898 of file ZDCFitWrapper.h.

898{return 0;}

◆ 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 ZDCFitExpFermiLinearPrePulse::GetPostAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 896 of file ZDCFitWrapper.h.

896{return 0;}

◆ GetPostT0()

virtual float ZDCFitExpFermiLinearPrePulse::GetPostT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 895 of file ZDCFitWrapper.h.

895{return 0;}

◆ GetPreAmp()

virtual float ZDCFitExpFermiLinearPrePulse::GetPreAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 893 of file ZDCFitWrapper.h.

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

◆ GetPreT0()

virtual float ZDCFitExpFermiLinearPrePulse::GetPreT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 884 of file ZDCFitWrapper.h.

884 {
885 float fitPreT0 = GetWrapperTF1()->GetParameter(3);
886
887 // Correct the time to the maximum
888 //
889 fitPreT0 += m_timeCorr;
890
891 return fitPreT0;
892 }

◆ GetPreT0ParIndex()

unsigned int ZDCFitExpFermiLinearPrePulse::GetPreT0ParIndex ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 876 of file ZDCFitWrapper.h.

876{return 3;}

◆ GetShapeParameter()

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

Implements ZDCFitWrapper.

Definition at line 904 of file ZDCFitWrapper.h.

905 {
906 if (index == 0) return m_tau1;
907 else if (index == 1) return m_tau2;
908 else if (index < 5) return GetWrapperTF1()->GetParameter(index);
909 else throw std::runtime_error("Fit parameter does not exist.");
910 }

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

Implements ZDCFitWrapper.

Definition at line 881 of file ZDCFitWrapper.h.

881{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitExpFermiLinearPrePulse::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 882 of file ZDCFitWrapper.h.

882{return m_tau2;}

◆ GetTime()

virtual float ZDCFitExpFermiLinearPrePulse::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 900 of file ZDCFitWrapper.h.

900 {
901 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
902 }

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

Implements ZDCFitWrapper.

Definition at line 931 of file ZDCFitWrapper.h.

932 {
933 double t = x[0];
934
935 double amp = p[0];
936 double t0 = p[1];
937 double preAmp = p[2];
938 double preT0 = p[3];
939 double linSlope = p[4];
940
941 double deltaT = t - t0;
942 double deltaTPre = t - preT0;
943
944 // We subtract off the value of the pre-pulse at the minimum time (nominally 0,
945 // but can change if we exclude early samples) to account for the subtraction of the pre-sample
946 //
947 double deltaPresamp = GetTMinAdjust() - preT0;
948
949 double pulse1 = amp * m_norm * m_expFermiFunc->operator()(deltaT);
950 double pulse2 = preAmp * m_norm * (m_expFermiFunc->operator()(deltaTPre) -
951 m_expFermiFunc->operator()(deltaPresamp));
952
953 double bckgd = linSlope * (t - deltaPresamp) + p[5];
954
955 return pulse1 + pulse2 + bckgd;
956 }
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 ZDCFitExpFermiLinearPrePulse::SetInitialPrePulse ( float amp,
float t0,
float ,
bool  )
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 868 of file ZDCFitWrapper.h.

868 {
869 GetWrapperTF1()->SetParameter(2, std::max(amp, (float) 1.5)); //1.5 here ensures that we're above lower limit
870 GetWrapperTF1()->SetParameter(3, t0);
871 }

◆ SetPostPulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 874 of file ZDCFitWrapper.h.

874{return;}

◆ SetPrePulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 813 of file ZDCFitWrapper.cxx.

814{
815 GetWrapperTF1()->SetParLimits(3, tmin, tmax);
816}

◆ SetT0FitLimits()

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

Implements ZDCFitWrapper.

Definition at line 842 of file ZDCFitWrapper.cxx.

843{
844 GetWrapperTF1()->SetParLimits(1, t0Min, t0Max);
845}

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

Implements ZDCFitWrapper.

Definition at line 805 of file ZDCFitWrapper.cxx.

806{
807 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
808
809 theTF1->ReleaseParameter(4);
810 theTF1->ReleaseParameter(5);
811}

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

Definition at line 856 of file ZDCFitWrapper.h.

◆ m_norm

float ZDCFitExpFermiLinearPrePulse::m_norm
private

Definition at line 854 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 ZDCFitExpFermiLinearPrePulse::m_tau1
private

Definition at line 852 of file ZDCFitWrapper.h.

◆ m_tau2

float ZDCFitExpFermiLinearPrePulse::m_tau2
private

Definition at line 853 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 ZDCFitExpFermiLinearPrePulse::m_timeCorr
private

Definition at line 855 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: