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  ZDCFitWrapper::FitParameter
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 1681 of file ZDCFitWrapper.h.

1682{
1683 float fitT0 = theTF1->GetParameter(1);
1684
1685 float tau1 = theTF1->GetParameter(2);
1686 float tau2 = theTF1->GetParameter(3);
1687
1688 // Correct the time to the maximum
1689 //
1690 double corrT0 = fitT0;
1691 if (tau2 > tau1) corrT0 += tau1 * std::log(tau2 / tau1 - 1.0);
1692
1693 double deltaT = theTF1->GetParameter(5)/8;
1694 double tmin = corrT0 - deltaT;
1695 double tmax = corrT0 + deltaT;
1696
1697 return theTF1->GetMaximumX(tmin, tmax, 1e-4, 20, false);
1698}

◆ ZDCFermiExpFit()

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

Definition at line 1701 of file ZDCFitWrapper.h.

1702{
1703 double t = xvec[0];
1704
1705 double amp = pvec[0];
1706 double t0 = pvec[1];
1707 double tau1 = pvec[2];
1708 double tau2 = pvec[3];
1709 double C = pvec[4];
1710
1711 double tauRatio = tau2 / tau1;
1712 double tauRatioMinunsOne = tauRatio - 1;
1713
1714 double norm = (std::pow(1. / tauRatioMinunsOne, 1. / (1 + tauRatio)) /
1715 ( 1 + std::pow(1. / tauRatioMinunsOne, 1. / (1 + 1 / tauRatio))));
1716
1717 double deltaT = t - t0;
1718 if (deltaT < 0) deltaT = 0;
1719
1720 double expTerm = std::exp(-deltaT / tau2);
1721 double fermiTerm = 1. / (1. + std::exp(-(t - t0) / tau1));
1722
1723 return amp * expTerm * fermiTerm / norm + C;
1724}
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 1762 of file ZDCFitWrapper.h.

1763{
1764 double t = xvec[0];
1765
1766 double amp = pvec[0];
1767 double t0 = pvec[1];
1768 double tau1 = pvec[2];
1769 double tau2 = pvec[3];
1770 double C = pvec[4];
1771
1772 double period = pvec[5];
1773 double Acos = pvec[6];
1774 double Bsin = pvec[7];
1775 double bI = pvec[8];
1776 double delta = pvec[9];
1777
1778 double twoPiOverPeriod = 2.0*M_PI/period;
1779
1780 double deltaT = t - t0;
1781 double norm = 1, expTerm = 1, fermiTerm = 1, inductTerm = 1;
1782
1783 if (deltaT > 0) {
1784 inductTerm = (1.0 + exp(-bI*deltaT)*(Acos*std::cos(deltaT*twoPiOverPeriod) +
1785 Bsin*std::sin(deltaT*twoPiOverPeriod)))/(1+Acos);
1786 expTerm = delta + std::exp(-deltaT / tau2)*inductTerm;
1787 }
1788 if (deltaT/tau1 < 7) fermiTerm = 1. / (1. + std::exp(-deltaT / tau1));
1789
1790 return amp * expTerm * fermiTerm * inductTerm/ norm + C;
1791}
#define M_PI

◆ ZDCFermiExpFitRefl()

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

Definition at line 1726 of file ZDCFitWrapper.h.

1727{
1728 double t = xvec[0];
1729
1730 double amp = pvec[0];
1731 double t0 = pvec[1];
1732 double tau1 = pvec[2];
1733 double tau2 = pvec[3];
1734 double C = pvec[4];
1735
1736 double refldelay = pvec[5];
1737 double reflFrac = pvec[6];
1738 double reflwidth = pvec[7];
1739 double delta = pvec[8];
1740
1741 double tauRatio = tau2 / tau1;
1742 double tauRatioMinunsOne = tauRatio - 1;
1743
1744 double norm = std::pow(1. / tauRatioMinunsOne, 1. / (1 + tauRatio)) /
1745 ( 1 + std::pow(1. / tauRatioMinunsOne, 1. / (1 + 1 / tauRatio))) ;
1746
1747 double deltaT = t - t0;
1748 if (deltaT < 0) deltaT = 0;
1749
1750 // Note: the small constant added here accounts for the very long tail on the pulse
1751 // which doesn't go to zero over the time range that we sample
1752 //
1753 double expTerm = delta + std::exp(-deltaT / tau2);
1754 double fermiTerm = 1. / (1. + std::exp(-(t - t0) / tau1));
1755
1756 double deltaTRefl = deltaT - refldelay;
1757 double reflTerm = -reflFrac*amp*std::exp(-0.5*deltaTRefl*deltaTRefl/reflwidth/reflwidth);
1758
1759 return amp * expTerm * fermiTerm / norm + C + reflTerm;
1760}