1#ifndef BmnHgndCalibration_H
2#define BmnHgndCalibration_H
4#include <boost/math/special_functions/lambert_w.hpp>
15 TdcFromTot(
double offset_,
double p_,
double tau_,
double RC_)
21 const double e = std::exp(1.0);
22 const double Tp = (2 * e - 1) *
p *
tau *
RC / (e - 1) / (
RC * (1 -
p) -
tau);
23 scale = Tp / 2. /
RC * std::sqrt((e - 1) /
p) * std::exp(Tp / 2. /
RC);
28 if (!std::isfinite(
scale))
30 double arg =
scale * std::exp(-tot / 2. /
RC);
31 double tdc =
offset + 2 *
RC * boost::math::lambert_w0(arg);
32 return std::isfinite(tdc) ? tdc :
offset;
47 const double e = std::exp(1.0);
48 const double Tp = (2 * e - 1) *
p *
tau *
RC / (e - 1) / (
RC * (1 -
p) -
tau);
49 scale = Tp * std::sqrt((e - 1) /
p) * std::exp(Tp / 2. /
RC);
54 if (!std::isfinite(
scale))
57 return std::isfinite(tdc) ? tdc :
offset;
69 QdcFromTot(
double p_,
double tau_,
double RC_,
double theta_ = 20.0,
double Rload_ = 33.0)
75 ,
tdcRaw(0.0, p_, tau_, RC_)
77 const double e = std::exp(1.0);
79 double como =
p *
Tp / 2. / (e - 1);
85 if (!std::isfinite(
scale))
89 const double tdc =
tdcRaw(tot);
90 const double qdc =
scale * std::exp((tot + tdc -
Tp) /
RC);
91 return std::isfinite(qdc) ? qdc : 0.0;
102 QdcFromTotApprox(
double p_,
double tau_,
double RC_,
double theta_ = 20.0,
double Rload_ = 33.0)
109 const double e = std::exp(1.0);
111 double lamda =
RC +
Tp;
117 if (!std::isfinite(
scale))
121 return std::isfinite(qdc) ? qdc : 0.0;
friend F32vec4 exp(const F32vec4 &a)
double operator()(double tot) const
QdcFromTotApprox(double p_, double tau_, double RC_, double theta_=20.0, double Rload_=33.0)
double operator()(double tot) const
QdcFromTot(double p_, double tau_, double RC_, double theta_=20.0, double Rload_=33.0)
TdcFromTotApprox(double offset_, double p_, double tau_, double RC_)
double operator()(double tot) const
double operator()(double tot) const
TdcFromTot(double offset_, double p_, double tau_, double RC_)