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

#include <ZDCFitWrapper.h>

Inheritance diagram for ZDCFitExpFermiPrePulse:
Collaboration diagram for ZDCFitExpFermiPrePulse:

Public Member Functions

 ZDCFitExpFermiPrePulse (const std::string &tag, float tmin, float tmax, float tau1, float tau2)
 ~ZDCFitExpFermiPrePulse ()
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, bool) override
virtual void SetPrePulseT0Range (float tmin, float tmax) override
virtual void SetPostPulseT0Range (float, float, float) override
virtual void ConstrainFit () override
virtual void UnconstrainFit () override
virtual 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 {0}
float m_tau2 {0}
float m_norm {0}
float m_timeCorr {0}
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 360 of file ZDCFitWrapper.h.

Constructor & Destructor Documentation

◆ ZDCFitExpFermiPrePulse()

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

Definition at line 273 of file ZDCFitWrapper.cxx.

273 :
274 ZDCPrePulseFitWrapper(std::make_shared<TF1>(("ExpFermiPrePulse" + tag).c_str(), this, tmin, tmax, 5)),
275 m_tau1(tau1), m_tau2(tau2)
276{
277 // Create the reference function that we use to evaluate ExpFermiFit more efficiently
278 //
279 std::string funcNameRefFunc = "ExpFermiPrePulseRefFunc" + tag;
280
281 m_expFermiFunc = std::make_shared<TF1>(funcNameRefFunc.c_str(), ZDCFermiExpFit, -50, 100, 5);
282
283 m_expFermiFunc->SetParameter(0, 1);
284 m_expFermiFunc->SetParameter(1, 0);
285 m_expFermiFunc->SetParameter(2, m_tau1);
286 m_expFermiFunc->SetParameter(3, m_tau2);
287 m_expFermiFunc->SetParameter(4, 0);
288
289 m_norm = 1. / m_expFermiFunc->GetMaximum();
290 m_timeCorr = m_tau1 * std::log(m_tau2 / m_tau1 - 1.0);
291
292 // Now set up the actual TF1
293 //
294 std::shared_ptr<TF1> theTF1 = ZDCFitWrapper::GetWrapperTF1();
295
296 // BAC, parameter 0 limits now is set in DoInitialize
297 theTF1->SetParLimits(1, tmin, tmax);
298 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.
299 theTF1->SetParLimits(3, -20, 10);
300
301 theTF1->SetParName(0, "Amp");
302 theTF1->SetParName(1, "T0");
303 theTF1->SetParName(2, "Amp_{pre}");
304 theTF1->SetParName(3, "T0_{pre}");
305 theTF1->SetParName(4, "C");
306}
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)

◆ ~ZDCFitExpFermiPrePulse()

ZDCFitExpFermiPrePulse::~ZDCFitExpFermiPrePulse ( )
inline

Definition at line 373 of file ZDCFitWrapper.h.

373{}

Member Function Documentation

◆ ConstrainFit()

void ZDCFitExpFermiPrePulse::ConstrainFit ( )
overridevirtual

Implements ZDCFitWrapper.

Definition at line 308 of file ZDCFitWrapper.cxx.

309{
310 // We force the constant term and per-pulse amplitude to zero
311 //
312 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
313
314 theTF1->FixParameter(2, 0);
315 theTF1->FixParameter(4, 0);
316}

◆ DoInitialize()

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

Implements ZDCFitWrapper.

Definition at line 340 of file ZDCFitWrapper.cxx.

341{
342 GetWrapperTF1()->SetParameter(0, initialAmp);
343 GetWrapperTF1()->SetParameter(1, initialT0);
344 GetWrapperTF1()->SetParameter(2, 5);
345 GetWrapperTF1()->SetParLimits(0, ampMin, ampMax);
346
347 // Set parameter errors for fit step size
348 //
349 double ampStep = std::min(0.05*initialAmp, std::abs(ampMax - initialAmp)/2.);
350 GetWrapperTF1()->SetParError(0, ampStep);
351 GetWrapperTF1()->SetParError(1, 1.0);
352 GetWrapperTF1()->SetParError(2, 2);
353 GetWrapperTF1()->SetParError(3, 1.0);
354 GetWrapperTF1()->SetParError(4, 1.0);
355}

◆ GetAmpError()

virtual float ZDCFitExpFermiPrePulse::GetAmpError ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 393 of file ZDCFitWrapper.h.

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

◆ GetAmplitude()

virtual float ZDCFitExpFermiPrePulse::GetAmplitude ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 392 of file ZDCFitWrapper.h.

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

◆ GetBkgdMaxFraction()

virtual float ZDCFitExpFermiPrePulse::GetBkgdMaxFraction ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 418 of file ZDCFitWrapper.h.

419 {
420 const TF1* theTF1 = ZDCFitWrapper::GetWrapperTF1();
421
422 double maxTime = GetTime();
423
424 double amp = theTF1->GetParameter(0);
425 if (amp <= 0) return -1;
426
427 double preAmp = theTF1->GetParameter(2);
428 double preT0 = theTF1->GetParameter(3);
429
430 double deltaTPre = maxTime - preT0;
431 double background = preAmp * m_norm * m_expFermiFunc->operator()(deltaTPre);
432
433 return background / (amp + background);
434 }
virtual float GetTime() const override

◆ GetExpAmp()

virtual float ZDCFitExpFermiPrePulse::GetExpAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 404 of file ZDCFitWrapper.h.

404{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 ZDCFitExpFermiPrePulse::GetPostAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 402 of file ZDCFitWrapper.h.

402{return 0;}

◆ GetPostT0()

virtual float ZDCFitExpFermiPrePulse::GetPostT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 401 of file ZDCFitWrapper.h.

401{return 0;}

◆ GetPreAmp()

virtual float ZDCFitExpFermiPrePulse::GetPreAmp ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 399 of file ZDCFitWrapper.h.

399{return 0;}

◆ GetPreT0()

virtual float ZDCFitExpFermiPrePulse::GetPreT0 ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 398 of file ZDCFitWrapper.h.

398{return 0;}

◆ GetPreT0ParIndex()

virtual unsigned int ZDCFitExpFermiPrePulse::GetPreT0ParIndex ( ) const
inlineoverridevirtual

Implements ZDCPrePulseFitWrapper.

Definition at line 390 of file ZDCFitWrapper.h.

390{return 3;}

◆ GetShapeParameter()

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

Implements ZDCFitWrapper.

Definition at line 410 of file ZDCFitWrapper.h.

411 {
412 if (index == 0) return m_tau1;
413 else if (index == 1) return m_tau2;
414 else if (index < 5) return GetWrapperTF1()->GetParameter(index);
415 else throw std::runtime_error("Fit parameter does not exist.");
416 }

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

Implements ZDCFitWrapper.

Definition at line 395 of file ZDCFitWrapper.h.

395{return m_tau1;}

◆ GetTau2()

virtual float ZDCFitExpFermiPrePulse::GetTau2 ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 396 of file ZDCFitWrapper.h.

396{return m_tau2;}

◆ GetTime()

virtual float ZDCFitExpFermiPrePulse::GetTime ( ) const
inlineoverridevirtual

Implements ZDCFitWrapper.

Definition at line 406 of file ZDCFitWrapper.h.

406 {
407 return GetWrapperTF1()->GetParameter(1) + m_timeCorr; // Correct the time to the maximum
408 }

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

Implements ZDCFitWrapper.

Definition at line 436 of file ZDCFitWrapper.h.

437 {
438 double t = x[0];
439
440 double amp = p[0];
441 double t0 = p[1];
442 double preAmp = p[2];
443 double preT0 = p[3];
444 double C = p[4];
445
446 double deltaT = t - t0;
447 double deltaTPre = t - preT0;
448
449 // We subtract off the value of the pre-pulse at the minimum time (nominally 0,
450 // but can change if we exclude early samples) to account for the subtraction of the pre-sample
451 //
452 double deltaPresamp = GetTMinAdjust() - preT0;
453
454 // double bckgd = linSlope*t;
455
456 double pulse1 = amp*m_norm*m_expFermiFunc->operator()(deltaT);
457 double pulse2 = preAmp * m_norm * (m_expFermiPreFunc->operator()(deltaTPre) -
458 m_expFermiPreFunc->operator()(deltaPresamp));
459
460 return C + pulse1 + pulse2;// + bckgd;
461 }
static Double_t t0
#define x
std::shared_ptr< TF1 > m_expFermiPreFunc
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 }

◆ SetInitialPrePulse()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 379 of file ZDCFitWrapper.h.

379 {
380 GetWrapperTF1()->SetParameter(2, std::max(amp, (float) 1.5)); //1.5 here ensures that we're above lower limit
381 GetWrapperTF1()->SetParameter(3, t0);
382 }

◆ SetPostPulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 385 of file ZDCFitWrapper.h.

385{return;}

◆ SetPrePulseT0Range()

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

Implements ZDCPrePulseFitWrapper.

Definition at line 326 of file ZDCFitWrapper.cxx.

327{
328 if (tmin > GetTMin()) {
329 m_preT0Min = tmin;
330 GetWrapperTF1()->ReleaseParameter(3);
331 GetWrapperTF1()->SetParLimits(3, tmin, tmax);
332 }
333 else {
334 m_preT0Min = -25;
335 GetWrapperTF1()->SetParLimits(3, -25, tmax);
336 }
337 m_preT0Max = tmax;
338}
float GetTMin() const

◆ SetT0FitLimits()

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

Implements ZDCFitWrapper.

Definition at line 357 of file ZDCFitWrapper.cxx.

358{
359 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
360 theTF1->SetParLimits(1, t0Min, t0Max);
361}

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

Implements ZDCFitWrapper.

Definition at line 317 of file ZDCFitWrapper.cxx.

318{
319 std::shared_ptr<TF1> theTF1 = GetWrapperTF1();
320 theTF1->ReleaseParameter(2);
321 theTF1->ReleaseParameter(4);
322
323 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.
324}

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> ZDCFitExpFermiPrePulse::m_expFermiFunc = 0
private

Definition at line 368 of file ZDCFitWrapper.h.

◆ m_expFermiPreFunc

std::shared_ptr<TF1> ZDCFitExpFermiPrePulse::m_expFermiPreFunc = 0
private

Definition at line 369 of file ZDCFitWrapper.h.

◆ m_norm

float ZDCFitExpFermiPrePulse::m_norm {0}
private

Definition at line 365 of file ZDCFitWrapper.h.

365{0};

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

Definition at line 363 of file ZDCFitWrapper.h.

363{0};

◆ m_tau2

float ZDCFitExpFermiPrePulse::m_tau2 {0}
private

Definition at line 364 of file ZDCFitWrapper.h.

364{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 ZDCFitExpFermiPrePulse::m_timeCorr {0}
private

Definition at line 366 of file ZDCFitWrapper.h.

366{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: