ATLAS Offline Software
Loading...
Searching...
No Matches
ZDCFitWrapper.h File Reference
#include "CxxUtils/checker_macros.h"
#include <TF1.h>
#include <memory>
#include <cmath>
#include <stdexcept>
#include <algorithm>
Include dependency graph for ZDCFitWrapper.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  ZDCFitWrapper
class  ZDCPrePulseFitWrapper
class  ZDCPreExpFitWrapper
class  ZDCFitExpFermiVariableTaus
class  ZDCFitExpFermiVariableTausLHCf
class  ZDCFitExpFermiVariableTausInduct
class  ZDCFitExpFermiVariableTausRun3
class  ZDCFitExpFermiFixedTaus
class  ZDCFitExpFermiPrePulse
class  ZDCFitExpFermiLHCfPrePulse
class  ZDCFitExpFermiPreExp
class  ZDCFitExpFermiLHCfPreExp
class  ZDCFitExpFermiInductPreExp
class  ZDCFitExpFermiInductPrePulse
class  ZDCFitExpFermiLinearFixedTaus
class  ZDCFitExpFermiLinearPrePulse
class  ZDCFitComplexPrePulse
class  ZDCFitGeneralPulse

Functions

double ZDCFermiExpFit (const double *xvec, const double *pvecpvec)
double ZDCFermiExpFitRefl (const double *xvec, const double *pvecpvec)
double ZDCFermiExpFitInduct (const double *xvec, const double *pvecpvec)
double getInductFuncTimeMax (const TF1 *theTF1)

Function Documentation

◆ getInductFuncTimeMax()

double getInductFuncTimeMax ( const TF1 * theTF1)
inline

Definition at line 1574 of file ZDCFitWrapper.h.

1575{
1576 float fitT0 = theTF1->GetParameter(1);
1577
1578 float tau1 = theTF1->GetParameter(2);
1579 float tau2 = theTF1->GetParameter(3);
1580
1581 // Correct the time to the maximum
1582 //
1583 double corrT0 = fitT0;
1584 if (tau2 > tau1) corrT0 += tau1 * std::log(tau2 / tau1 - 1.0);
1585
1586 double deltaT = theTF1->GetParameter(5)/8;
1587 double tmin = corrT0 - deltaT;
1588 double tmax = corrT0 + deltaT;
1589
1590 return theTF1->GetMaximumX(tmin, tmax, 1e-4, 20, false);
1591}

◆ ZDCFermiExpFit()

double ZDCFermiExpFit ( const double * xvec,
const double * pvec )
inline

Definition at line 1594 of file ZDCFitWrapper.h.

1595{
1596 double t = xvec[0];
1597
1598 double amp = pvec[0];
1599 double t0 = pvec[1];
1600 double tau1 = pvec[2];
1601 double tau2 = pvec[3];
1602 double C = pvec[4];
1603
1604 double tauRatio = tau2 / tau1;
1605 double tauRatioMinunsOne = tauRatio - 1;
1606
1607 double norm = (std::pow(1. / tauRatioMinunsOne, 1. / (1 + tauRatio)) /
1608 ( 1 + std::pow(1. / tauRatioMinunsOne, 1. / (1 + 1 / tauRatio))));
1609
1610 double deltaT = t - t0;
1611 if (deltaT < 0) deltaT = 0;
1612
1613 double expTerm = std::exp(-deltaT / tau2);
1614 double fermiTerm = 1. / (1. + std::exp(-(t - t0) / tau1));
1615
1616 return amp * expTerm * fermiTerm / norm + C;
1617}
std::array< fp_t, 2 > pvec
static Double_t t0
struct color C

◆ ZDCFermiExpFitInduct()

double ZDCFermiExpFitInduct ( const double * xvec,
const double * pvec )
inline

Definition at line 1655 of file ZDCFitWrapper.h.

1656{
1657 double t = xvec[0];
1658
1659 double amp = pvec[0];
1660 double t0 = pvec[1];
1661 double tau1 = pvec[2];
1662 double tau2 = pvec[3];
1663 double C = pvec[4];
1664
1665 double period = pvec[5];
1666 double Acos = pvec[6];
1667 double Bsin = pvec[7];
1668 double tauI = pvec[8];
1669 double delta = pvec[9];
1670
1671 double twoPiOverPeriod = 2.0*M_PI/period;
1672
1673 double deltaT = t - t0;
1674 double norm = 1, expTerm = 1, fermiTerm = 1, inductTerm = 1;
1675
1676 if (deltaT > 0) {
1677 expTerm = delta + std::exp(-deltaT / tau2);
1678 inductTerm = (1.0 + exp(-deltaT/tauI)*(Acos*std::cos(deltaT*twoPiOverPeriod) +
1679 Bsin*std::sin(deltaT*twoPiOverPeriod)))/(1+Acos);
1680 }
1681 if (deltaT/tau1 < 7) fermiTerm = 1. / (1. + std::exp(-deltaT / tau1));
1682
1683 return amp * expTerm * fermiTerm * inductTerm/ norm + C;
1684}
#define M_PI

◆ ZDCFermiExpFitRefl()

double ZDCFermiExpFitRefl ( const double * xvec,
const double * pvec )
inline

Definition at line 1619 of file ZDCFitWrapper.h.

1620{
1621 double t = xvec[0];
1622
1623 double amp = pvec[0];
1624 double t0 = pvec[1];
1625 double tau1 = pvec[2];
1626 double tau2 = pvec[3];
1627 double C = pvec[4];
1628
1629 double refldelay = pvec[5];
1630 double reflFrac = pvec[6];
1631 double reflwidth = pvec[7];
1632 double delta = pvec[8];
1633
1634 double tauRatio = tau2 / tau1;
1635 double tauRatioMinunsOne = tauRatio - 1;
1636
1637 double norm = std::pow(1. / tauRatioMinunsOne, 1. / (1 + tauRatio)) /
1638 ( 1 + std::pow(1. / tauRatioMinunsOne, 1. / (1 + 1 / tauRatio))) ;
1639
1640 double deltaT = t - t0;
1641 if (deltaT < 0) deltaT = 0;
1642
1643 // Note: the small constant added here accounts for the very long tail on the pulse
1644 // which doesn't go to zero over the time range that we sample
1645 //
1646 double expTerm = delta + std::exp(-deltaT / tau2);
1647 double fermiTerm = 1. / (1. + std::exp(-(t - t0) / tau1));
1648
1649 double deltaTRefl = deltaT - refldelay;
1650 double reflTerm = -reflFrac*amp*std::exp(-0.5*deltaTRefl*deltaTRefl/reflwidth/reflwidth);
1651
1652 return amp * expTerm * fermiTerm / norm + C + reflTerm;
1653}