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

#include <ZDCFitWrapper.h>

Inheritance diagram for ZDCFitExpFermiPreExp:
Collaboration diagram for ZDCFitExpFermiPreExp:

Public Member Functions

 ZDCFitExpFermiPreExp (const std::string &tag, float tmin, float tmax, float tau1, float tau2, float defExpTau, float fixExpTau)
 ~ZDCFitExpFermiPreExp ()
virtual void DoInitialize (float initialAmp, float initialT0, float ampMin, float ampMax) override
virtual void SetT0FitLimits (float tMin, float tMax) override
virtual void SetInitialExpPulse (float amp) override
virtual void ConstrainFit () override
virtual void UnconstrainFit () override
virtual float GetAmplitude () const override
virtual float GetAmpError () const override
virtual float GetTau1 () const override
virtual float GetTau2 () const override
virtual float GetTime () const override
virtual float GetExpAmp () const override
virtual float GetExpTau () 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
bool fixExpTau () const
float getDefaultExpTau () const
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)
bool finalized () const
virtual void Finalize ()
virtual void DoFinalize ()
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_defaultTau
bool m_fixTau

Private Attributes

float m_tau1 {0}
float m_tau2 {0}
float m_timeCorr {0}
double m_norm {}
std::shared_ptr< TF1 > m_expFermiFunc {0}
std::shared_ptr< TF1 > m_expFermiPreFunc {0}
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}
bool m_finalized {false}

Detailed Description

Definition at line 682 of file ZDCFitWrapper.h.

Constructor & Destructor Documentation

◆ ZDCFitExpFermiPreExp()

ZDCFitExpFermiPreExp::ZDCFitExpFermiPreExp ( const std::string & tag,
float tmin,
float tmax,
float tau1,
float tau2,
float defExpTau,
float fixExpTau )

Definition at line 461 of file ZDCFitWrapper.cxx.

462 :
463 ZDCPreExpFitWrapper(std::make_shared<TF1>(("ExpFermiPreExp" + tag).c_str(), this, tmin, tmax, 6), defExpTau, fixExpTau),
464 m_tau1(tau1), m_tau2(tau2)
465{
466 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
467 //
468 std::string funcNameRefFunc = "ExpFermiPreExpRefFunc" + tag;
469
470 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, tmin, tmax, 8);
471
472 // The parameters for the FermiExp
473 //
474 m_expFermiFunc->SetParameter(0, 1);
475 m_expFermiFunc->SetParameter(1, 0);
476 m_expFermiFunc->SetParameter(2, m_tau1);
477 m_expFermiFunc->SetParameter(3, m_tau2);
478 m_expFermiFunc->SetParameter(4, 0);
479
480 m_norm = 1. / m_expFermiFunc->GetMaximum();
481 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
482
483 // Now set up the actual TF1
484 //
485 std::shared_ptr<TF1> theTF1 = ZDCFitWrapper::GetWrapperTF1();
486 theTF1->SetParName(0, "Amp");
487 theTF1->SetParName(1, "T0");
488 theTF1->SetParName(2, "Amp_{pre}");
489 theTF1->SetParName(3, "tau_{pre}");
490 theTF1->SetParName(4, "tausqrt_{pre}");
491 theTF1->SetParName(5, "C");
492
493 theTF1->SetParLimits(1, tmin, tmax);
494 theTF1->SetParLimits(2, -1, 8196); // Increase the upper range to 2 times of ADC range to deal with large exponential tail case of pre-pulse.
495 theTF1->SetParLimits(3, 6, 30);
496 theTF1->SetParLimits(4, -0.2, 0.2);
497 theTF1->SetParLimits(5, -50, 50);
498}
double ZDCFermiExpFit(const double *xvec, const double *pvec)
std::shared_ptr< TF1 > m_expFermiFunc
virtual std::shared_ptr< TF1 > GetWrapperTF1()
ZDCPreExpFitWrapper(std::shared_ptr< TF1 > wrapperTF1, float defaultExpTau, bool fixTau)
bool fixExpTau() const

◆ ~ZDCFitExpFermiPreExp()

ZDCFitExpFermiPreExp::~ZDCFitExpFermiPreExp ( )
inline

Definition at line 696 of file ZDCFitWrapper.h.

696{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitExpFermiPreExp::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 500 of file ZDCFitWrapper.cxx.

501{
502 // We force the constant term and per-pulse amplitude to zero
503 //
504 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
505
506 theTF1->FixParameter(2, 0);
507 theTF1->FixParameter(3, getDefaultExpTau());
508 theTF1->FixParameter(5, 0);
509}
float getDefaultExpTau() const

◆ DoFinalize()

virtual void ZDCFitWrapper::DoFinalize ( )
inlinevirtualinherited

◆ DoInitialize()

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

Implements ZDCFitWrapper.

Definition at line 526 of file ZDCFitWrapper.cxx.

527{
528 GetWrapperTF1()->SetParameter(0, initialAmp);
529 GetWrapperTF1()->SetParameter(1, initialT0);
530 GetWrapperTF1()->SetParameter(2, 0);
531 GetWrapperTF1()->SetParameter(3, getDefaultExpTau());
532 GetWrapperTF1()->SetParameter(4, 0.);
533 GetWrapperTF1()->SetParameter(5, 0);
534
535 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
536
537 // Set parameter errors for fit step size
538 //
539 double ampStep = std::min(0.05*initialAmp, std::abs(ampMax - initialAmp)/2.);
540 GetWrapperTF1()->SetParError(0, ampStep);
541 GetWrapperTF1()->SetParError(1, 1.0);
542 GetWrapperTF1()->SetParError(2, ampStep/2);
543 GetWrapperTF1()->SetParError(3, 1.0);
544 GetWrapperTF1()->SetParError(4, 0.025);
545 GetWrapperTF1()->SetParError(5, 1.0);
546}

◆ Finalize()

virtual void ZDCFitWrapper::Finalize ( )
inlinevirtualinherited

Definition at line 68 of file ZDCFitWrapper.h.

69 {
70 DoFinalize();
71 m_finalized = true;
72 }
virtual void DoFinalize()

◆ finalized()

bool ZDCFitWrapper::finalized ( ) const
inlineinherited

Definition at line 66 of file ZDCFitWrapper.h.

66{return m_finalized;}

◆ fixExpTau()

bool ZDCPreExpFitWrapper::fixExpTau ( ) const
inlineinherited

Definition at line 174 of file ZDCFitWrapper.h.

174{return m_fixTau;}

◆ GetAmpError()

virtual float ZDCFitExpFermiPreExp::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 710 of file ZDCFitWrapper.h.

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

◆ GetAmplitude()

virtual float ZDCFitExpFermiPreExp::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 709 of file ZDCFitWrapper.h.

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

◆ GetBkgdMaxFraction()

virtual float ZDCFitExpFermiPreExp::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 730 of file ZDCFitWrapper.h.

731 {
732 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
733 double maxTime = GetTime();
734
735 double amp = theTF1->GetParameter(0);
736 if (amp <= 0) return -1;
737
738 double preAmp = theTF1->GetParameter(2);
739 double preT0 = theTF1->GetParameter(3);
740
741 double deltaTPre = maxTime - preT0;
742 double background = preAmp * m_norm * m_expFermiFunc->operator()(deltaTPre);
743
744 return background / (amp + background);
745 }
virtual float GetTime() const override

◆ getDefaultExpTau()

float ZDCPreExpFitWrapper::getDefaultExpTau ( ) const
inlineinherited

Definition at line 175 of file ZDCFitWrapper.h.

175{return m_defaultTau;}

◆ GetExpAmp()

virtual float ZDCFitExpFermiPreExp::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPreExpFitWrapper.

Definition at line 719 of file ZDCFitWrapper.h.

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

◆ GetExpTau()

virtual float ZDCFitExpFermiPreExp::GetExpTau ( ) const
inlineoverridevirtual

Implements ZDCPreExpFitWrapper.

Definition at line 720 of file ZDCFitWrapper.h.

720{return GetWrapperTF1()->GetParameter(3);}

◆ GetMaxAmp()

float ZDCFitWrapper::GetMaxAmp ( ) const
inlineinherited

Definition at line 104 of file ZDCFitWrapper.h.

104{return m_ampMax;}

◆ GetMinAmp()

float ZDCFitWrapper::GetMinAmp ( ) const
inlineinherited

Definition at line 103 of file ZDCFitWrapper.h.

103{return m_ampMin;}

◆ GetNumShapeParameters()

virtual unsigned int ZDCFitExpFermiPreExp::GetNumShapeParameters ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 722 of file ZDCFitWrapper.h.

722{return 2;}

◆ GetShapeParameter()

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

Implements ZDCFitWrapper.

Definition at line 724 of file ZDCFitWrapper.h.

725 {
726 if (index < 2) return GetWrapperTF1()->GetParameter(index + 4);
727 else throw std::runtime_error("Fit parameter does not exist.");
728 }

◆ GetT0Max()

float ZDCFitWrapper::GetT0Max ( ) const
inlineinherited

Definition at line 114 of file ZDCFitWrapper.h.

114 {
115 if (m_adjTLimitsEvent) return m_tempTmax;
116 else return m_t0Max;
117 }

◆ GetT0Min()

float ZDCFitWrapper::GetT0Min ( ) const
inlineinherited

Definition at line 109 of file ZDCFitWrapper.h.

109 {
110 if (m_adjTLimitsEvent) return m_tempTmin;
111 else return m_t0Min;
112 }

◆ GetTau1()

virtual float ZDCFitExpFermiPreExp::GetTau1 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 712 of file ZDCFitWrapper.h.

712{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitExpFermiPreExp::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 713 of file ZDCFitWrapper.h.

713{return m_tau2;}

◆ GetTime()

virtual float ZDCFitExpFermiPreExp::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 715 of file ZDCFitWrapper.h.

715 {
716 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
717 }

◆ GetTMax()

float ZDCFitWrapper::GetTMax ( ) const
inlineinherited

Definition at line 107 of file ZDCFitWrapper.h.

107{return m_tmax;}

◆ GetTMin()

float ZDCFitWrapper::GetTMin ( ) const
inlineinherited

Definition at line 106 of file ZDCFitWrapper.h.

106{return m_tmin;}

◆ GetTMinAdjust()

float ZDCFitWrapper::GetTMinAdjust ( ) const
inlineinherited

Definition at line 119 of file ZDCFitWrapper.h.

119{return m_tminAdjust;}

◆ GetWrapperTF1() [1/2]

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

Definition at line 128 of file ZDCFitWrapper.h.

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

◆ GetWrapperTF1() [2/2]

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

Definition at line 129 of file ZDCFitWrapper.h.

129{return m_wrapperTF1.get();}

◆ GetWrapperTF1RawPtr()

virtual TF1 * ZDCFitWrapper::GetWrapperTF1RawPtr ( ) const
inlinevirtualinherited

Definition at line 130 of file ZDCFitWrapper.h.

130{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 ZDCFitExpFermiPreExp::operator() ( const double * x,
const double * p )
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 747 of file ZDCFitWrapper.h.

748 {
749 double t = x[0];
750
751 double amp = p[0];
752 double t0 = p[1];
753 double expAmp = p[2];
754 double expTau = p[3];
755 double expSqrtTau = p[4];
756 double C = p[5];
757
758 double deltaT = t - t0;
759 double pulse = amp * m_norm * m_expFermiFunc->operator()(deltaT);
760
761 // We subtract off the value of the exponential pulse at the minimum time (nominally 0),
762 // because it would have been included in the baseline subtraction
763 //
764 double tRef = GetTMinAdjust();
765 double expPre = 0;
766 if (t > 0 && std::abs(expSqrtTau)>1e-6) expPre = expAmp * (std::exp(-t/expTau-expSqrtTau*std::sqrt(t)) - std::exp(-tRef/expTau));
767 else expPre = expAmp * (std::exp(-t/expTau) - std::exp(-tRef/expTau));
768
769 return C + pulse + expPre;
770 }
static Double_t t0
#define x
float GetTMinAdjust() const
struct color C

◆ SetAmpMinMax()

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

Definition at line 79 of file ZDCFitWrapper.h.

80 {
81 m_ampMin = minAmp;
82 m_ampMax = maxAmp;
83 }

◆ SetInitialExpPulse()

virtual void ZDCFitExpFermiPreExp::SetInitialExpPulse ( float amp)
inlineoverridevirtual

Implements ZDCPreExpFitWrapper.

Definition at line 701 of file ZDCFitWrapper.h.

702 {
703 GetWrapperTF1()->SetParameter(2, std::max(amp, (float) 0.5)); //0.5 here ensures that we're above lower limit (0)
704 }

◆ SetT0FitLimits()

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

Implements ZDCFitWrapper.

Definition at line 548 of file ZDCFitWrapper.cxx.

549{
550 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
551 theTF1->SetParLimits(1, t0Min, t0Max);
552}

◆ SetT0Range()

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

Definition at line 85 of file ZDCFitWrapper.h.

86 {
87 m_t0Min = t0Min;
88 m_t0Max = t0Max;
89
90 SetT0FitLimits(t0Min, t0Max);
91 }

◆ UnconstrainFit()

void ZDCFitExpFermiPreExp::UnconstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 510 of file ZDCFitWrapper.cxx.

511{
512 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
513
514 theTF1->ReleaseParameter(2);
515 theTF1->SetParLimits(2, -1, 8196); // Increase the upper range to 2 times of ADC range to deal with large exponential tail case of pre-pulse.
516
517 theTF1->ReleaseParameter(3);
518 theTF1->SetParLimits(3, 6, 30);
519 theTF1->SetParameter(3, getDefaultExpTau());
520
521 theTF1->ReleaseParameter(5);
522 theTF1->SetParLimits(5, -50, 50);
523 theTF1->SetParameter(5, 0);
524}

Member Data Documentation

◆ m_adjTLimitsEvent

bool ZDCFitWrapper::m_adjTLimitsEvent {false}
privateinherited

Definition at line 37 of file ZDCFitWrapper.h.

37{false};

◆ m_ampMax

float ZDCFitWrapper::m_ampMax {0}
privateinherited

Definition at line 32 of file ZDCFitWrapper.h.

32{0};

◆ m_ampMin

float ZDCFitWrapper::m_ampMin {0}
privateinherited

Definition at line 31 of file ZDCFitWrapper.h.

31{0};

◆ m_defaultTau

float ZDCPreExpFitWrapper::m_defaultTau
protectedinherited

Definition at line 164 of file ZDCFitWrapper.h.

◆ m_expFermiFunc

std::shared_ptr<TF1> ZDCFitExpFermiPreExp::m_expFermiFunc {0}
private

Definition at line 690 of file ZDCFitWrapper.h.

690{0};

◆ m_expFermiPreFunc

std::shared_ptr<TF1> ZDCFitExpFermiPreExp::m_expFermiPreFunc {0}
private

Definition at line 691 of file ZDCFitWrapper.h.

691{0};

◆ m_finalized

bool ZDCFitWrapper::m_finalized {false}
privateinherited

Definition at line 42 of file ZDCFitWrapper.h.

42{false};

◆ m_fixTau

bool ZDCPreExpFitWrapper::m_fixTau
protectedinherited

Definition at line 165 of file ZDCFitWrapper.h.

◆ m_norm

double ZDCFitExpFermiPreExp::m_norm {}
private

Definition at line 688 of file ZDCFitWrapper.h.

688{};

◆ m_t0Max

float ZDCFitWrapper::m_t0Max {0}
privateinherited

Definition at line 35 of file ZDCFitWrapper.h.

35{0};

◆ m_t0Min

float ZDCFitWrapper::m_t0Min {0}
privateinherited

Definition at line 34 of file ZDCFitWrapper.h.

34{0};

◆ m_tau1

float ZDCFitExpFermiPreExp::m_tau1 {0}
private

Definition at line 685 of file ZDCFitWrapper.h.

685{0};

◆ m_tau2

float ZDCFitExpFermiPreExp::m_tau2 {0}
private

Definition at line 686 of file ZDCFitWrapper.h.

686{0};

◆ m_tempTmax

float ZDCFitWrapper::m_tempTmax {0}
privateinherited

Definition at line 40 of file ZDCFitWrapper.h.

40{0};

◆ m_tempTmin

float ZDCFitWrapper::m_tempTmin {0}
privateinherited

Definition at line 39 of file ZDCFitWrapper.h.

39{0};

◆ m_timeCorr

float ZDCFitExpFermiPreExp::m_timeCorr {0}
private

Definition at line 687 of file ZDCFitWrapper.h.

687{0};

◆ m_tmax

float ZDCFitWrapper::m_tmax {0}
privateinherited

Definition at line 29 of file ZDCFitWrapper.h.

29{0};

◆ m_tmin

float ZDCFitWrapper::m_tmin {0}
privateinherited

Definition at line 28 of file ZDCFitWrapper.h.

28{0};

◆ m_tminAdjust

float ZDCFitWrapper::m_tminAdjust {0}
privateinherited

Definition at line 38 of file ZDCFitWrapper.h.

38{0};

◆ m_wrapperTF1

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

Definition at line 26 of file ZDCFitWrapper.h.

26{};

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