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 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)
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}

Detailed Description

Definition at line 580 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 363 of file ZDCFitWrapper.cxx.

364 :
365 ZDCPreExpFitWrapper(std::make_shared<TF1>(("ExpFermiPreExp" + tag).c_str(), this, tmin, tmax, 6), defExpTau, fixExpTau),
366 m_tau1(tau1), m_tau2(tau2)
367{
368 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
369 //
370 std::string funcNameRefFunc = "ExpFermiPreExpRefFunc" + tag;
371
372 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, tmin, tmax, 8);
373
374 // The parameters for the FermiExp
375 //
376 m_expFermiFunc->SetParameter(0, 1);
377 m_expFermiFunc->SetParameter(1, 0);
378 m_expFermiFunc->SetParameter(2, m_tau1);
379 m_expFermiFunc->SetParameter(3, m_tau2);
380 m_expFermiFunc->SetParameter(4, 0);
381
382 m_norm = 1. / m_expFermiFunc->GetMaximum();
383 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
384
385 // Now set up the actual TF1
386 //
387 std::shared_ptr<TF1> theTF1 = ZDCFitWrapper::GetWrapperTF1();
388 theTF1->SetParName(0, "Amp");
389 theTF1->SetParName(1, "T0");
390 theTF1->SetParName(2, "Amp_{pre}");
391 theTF1->SetParName(3, "tau_{pre}");
392 theTF1->SetParName(4, "tausqrt_{pre}");
393 theTF1->SetParName(5, "C");
394
395 theTF1->SetParLimits(1, tmin, tmax);
396 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.
397 theTF1->SetParLimits(3, 6, 30);
398 theTF1->SetParLimits(4, -0.2, 0.2);
399 theTF1->SetParLimits(5, -50, 50);
400}
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 594 of file ZDCFitWrapper.h.

594{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitExpFermiPreExp::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 402 of file ZDCFitWrapper.cxx.

403{
404 // We force the constant term and per-pulse amplitude to zero
405 //
406 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
407
408 theTF1->FixParameter(2, 0);
409 theTF1->FixParameter(3, getDefaultExpTau());
410 theTF1->FixParameter(5, 0);
411}
float getDefaultExpTau() const

◆ DoInitialize()

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

Implements ZDCFitWrapper.

Definition at line 428 of file ZDCFitWrapper.cxx.

429{
430 GetWrapperTF1()->SetParameter(0, initialAmp);
431 GetWrapperTF1()->SetParameter(1, initialT0);
432 GetWrapperTF1()->SetParameter(2, 0);
433 GetWrapperTF1()->SetParameter(3, getDefaultExpTau());
434 GetWrapperTF1()->SetParameter(4, 0.);
435 GetWrapperTF1()->SetParameter(5, 0);
436
437 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
438
439 // Set parameter errors for fit step size
440 //
441 double ampStep = std::min(0.05*initialAmp, std::abs(ampMax - initialAmp)/2.);
442 GetWrapperTF1()->SetParError(0, ampStep);
443 GetWrapperTF1()->SetParError(1, 1.0);
444 GetWrapperTF1()->SetParError(2, ampStep/2);
445 GetWrapperTF1()->SetParError(3, 1.0);
446 GetWrapperTF1()->SetParError(4, 0.025);
447 GetWrapperTF1()->SetParError(5, 1.0);
448}

◆ fixExpTau()

bool ZDCPreExpFitWrapper::fixExpTau ( ) const
inlineinherited

Definition at line 156 of file ZDCFitWrapper.h.

156{return m_fixTau;}

◆ GetAmpError()

virtual float ZDCFitExpFermiPreExp::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 608 of file ZDCFitWrapper.h.

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

◆ GetAmplitude()

virtual float ZDCFitExpFermiPreExp::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 607 of file ZDCFitWrapper.h.

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

◆ GetBkgdMaxFraction()

virtual float ZDCFitExpFermiPreExp::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 628 of file ZDCFitWrapper.h.

629 {
630 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
631 double maxTime = GetTime();
632
633 double amp = theTF1->GetParameter(0);
634 if (amp <= 0) return -1;
635
636 double preAmp = theTF1->GetParameter(2);
637 double preT0 = theTF1->GetParameter(3);
638
639 double deltaTPre = maxTime - preT0;
640 double background = preAmp * m_norm * m_expFermiFunc->operator()(deltaTPre);
641
642 return background / (amp + background);
643 }
virtual float GetTime() const override

◆ getDefaultExpTau()

float ZDCPreExpFitWrapper::getDefaultExpTau ( ) const
inlineinherited

Definition at line 157 of file ZDCFitWrapper.h.

157{return m_defaultTau;}

◆ GetExpAmp()

virtual float ZDCFitExpFermiPreExp::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPreExpFitWrapper.

Definition at line 617 of file ZDCFitWrapper.h.

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

◆ GetExpTau()

virtual float ZDCFitExpFermiPreExp::GetExpTau ( ) const
inlineoverridevirtual

Implements ZDCPreExpFitWrapper.

Definition at line 618 of file ZDCFitWrapper.h.

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

◆ 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;}

◆ GetShapeParameter()

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

Implements ZDCFitWrapper.

Definition at line 620 of file ZDCFitWrapper.h.

621 {
622 if (index == 0) return m_tau1;
623 else if (index == 1) return m_tau2;
624 else if (index < 5) return GetWrapperTF1()->GetParameter(index);
625 else throw std::runtime_error("Fit parameter does not exist.");
626 }

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

Implements ZDCFitWrapper.

Definition at line 610 of file ZDCFitWrapper.h.

610{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitExpFermiPreExp::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 611 of file ZDCFitWrapper.h.

611{return m_tau2;}

◆ GetTime()

virtual float ZDCFitExpFermiPreExp::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 613 of file ZDCFitWrapper.h.

613 {
614 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
615 }

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

Implements ZDCFitWrapper.

Definition at line 645 of file ZDCFitWrapper.h.

646 {
647 double t = x[0];
648
649 double amp = p[0];
650 double t0 = p[1];
651 double expAmp = p[2];
652 double expTau = p[3];
653 double expSqrtTau = p[4];
654 double C = p[5];
655
656 double deltaT = t - t0;
657 double pulse = amp * m_norm * m_expFermiFunc->operator()(deltaT);
658
659 // We subtract off the value of the exponential pulse at the minimum time (nominally 0),
660 // because it would have been included in the baseline subtraction
661 //
662 double tRef = GetTMinAdjust();
663 double expPre = 0;
664 if (t > 0 && std::abs(expSqrtTau)>1e-6) expPre = expAmp * (std::exp(-t/expTau-expSqrtTau*std::sqrt(t)) - std::exp(-tRef/expTau));
665 else expPre = expAmp * (std::exp(-t/expTau) - std::exp(-tRef/expTau));
666
667 return C + pulse + expPre;
668 }
static Double_t t0
#define x
float GetTMinAdjust() const
struct color C

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

◆ SetInitialExpPulse()

virtual void ZDCFitExpFermiPreExp::SetInitialExpPulse ( float amp)
inlineoverridevirtual

Implements ZDCPreExpFitWrapper.

Definition at line 599 of file ZDCFitWrapper.h.

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

◆ SetT0FitLimits()

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

Implements ZDCFitWrapper.

Definition at line 450 of file ZDCFitWrapper.cxx.

451{
452 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
453 theTF1->SetParLimits(1, t0Min, t0Max);
454}

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

Implements ZDCFitWrapper.

Definition at line 412 of file ZDCFitWrapper.cxx.

413{
414 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
415
416 theTF1->ReleaseParameter(2);
417 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.
418
419 theTF1->ReleaseParameter(3);
420 theTF1->SetParLimits(3, 6, 30);
421 theTF1->SetParameter(3, getDefaultExpTau());
422
423 theTF1->ReleaseParameter(5);
424 theTF1->SetParLimits(5, -50, 50);
425 theTF1->SetParameter(5, 0);
426}

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_defaultTau

float ZDCPreExpFitWrapper::m_defaultTau
protectedinherited

Definition at line 146 of file ZDCFitWrapper.h.

◆ m_expFermiFunc

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

Definition at line 588 of file ZDCFitWrapper.h.

588{0};

◆ m_expFermiPreFunc

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

Definition at line 589 of file ZDCFitWrapper.h.

589{0};

◆ m_fixTau

bool ZDCPreExpFitWrapper::m_fixTau
protectedinherited

Definition at line 147 of file ZDCFitWrapper.h.

◆ m_norm

double ZDCFitExpFermiPreExp::m_norm
private

Definition at line 586 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 ZDCFitExpFermiPreExp::m_tau1 {0}
private

Definition at line 583 of file ZDCFitWrapper.h.

583{0};

◆ m_tau2

float ZDCFitExpFermiPreExp::m_tau2 {0}
private

Definition at line 584 of file ZDCFitWrapper.h.

584{0};

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

Definition at line 585 of file ZDCFitWrapper.h.

585{0};

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