18 : fName(std::move(name))
106 for(
int i = 0; i < m; i++) {
113 for(
int j = m - 2; j >= 0; j--) {
114 for(
int i = 0; i < m; i++) {
127 memset(pp, 0,
sizeof(
ParPar));
133 int k =
static_cast<int>(rint(x0));
135 for(
int i = low; i < k; i++) {
142 for(
int i = k; i < high; i++) {
143 double x = (i - x0) * (i - x0);
176 if(!
set ||
cN < 10) {
194 if(!
set ||
cN < 10) {
202 std::array<double, 3> chisq;
203 std::array<WaveFormPar, 3> w;
217 for(
double& i : chisq) {
223 memcpy(w.data(),
cWpar, swp);
225 memcpy(&w[1],
cWpar, swp);
227 memcpy(&w[2],
cWpar, swp);
232 for(
int i = 0; i < 3; i++) {
233 if(chisq[i] < chimin && chisq[i] > 0) {
240 memcpy(
cWpar, &w[imin], swp);
251 memset(pp, 0,
sizeof(
ParPar));
257 for(
int i = low; i < high; i++) {
292 memset(lp, 0,
sizeof(
LinePar));
298 for(
int i = low; i < high; i++) {
363 if(t < cN && t > 0) {
384 memset(&ppmin, 0,
sizeof(
ParPar));
402 for(t = kmin - 1; t < kmin + 1; t += 0.1) {
406 memcpy(&ppmin, &pp,
sizeof(
ParPar));
412 memcpy(&pp, &ppmin,
sizeof(
ParPar));
423 if(t < cN && t > 0) {
467 d = b * b - 4 * a * c;
477 t = 0.5 * (-b + d) / a;
487 if(t < cN && t > 0) {
505 std::cout <<
"Baseline range (" <<
cWpar->
baseline_range <<
") larger than waveform length!" << std::endl;
506 std::cout <<
"Terminating program" << std::endl;
535 if(
cN > tb && tb > 0) {
536 for(
int i = 0; i < tb; i++) {
563 for(i = D; i <
cN - D; i++) {
565 for(j = i - D; j < i + D; j++) {
582 std::cout <<
"Baseline not deterimned for the tfraction" << std::endl;
587 std::cout <<
"Maximum not deterimned for the tfraction" << std::endl;
653 for(i = imin; i < imax + 1; i++) {
668 double d = q * q - 4 * r * p;
757 w = 2 * TMath::Pi() / T;
761 snm = sin((
cN - 1) * w);
763 s2n = sin(2 *
cN * w);
764 s2nm = sin(2 * (
cN - 1) * w);
768 cnm = cos((
cN - 1) * w);
770 c2n = cos(2 *
cN * w);
771 c2nm = cos(2 * (
cN - 1) * w);
773 lineq_matrix[0][0] = 0.5 *
cN - 0.25 * (1 - c2 - c2n + c2nm) / (1 - c2);
774 lineq_matrix[0][1] = 0.25 * (s2 + s2nm - s2n) / (1 - c2);
778 lineq_matrix[1][1] = 0.5 *
cN + 0.25 * (1 - c2 - c2n + c2nm) / (1 - c2);
779 lineq_matrix[1][2] = 0.5 * (1 - c - cn + cnm) / (1 - c);
787 for(
int i = 0; i <
cN; i++) {
802 spar->
t0 = acos(c) * T / (2 * TMath::Pi());
804 spar->
t0 = (1 - acos(c) / (2 * TMath::Pi())) * T;
873 if(!
set ||
cN < 10) {
901 double r = s / f * 100;
905 if(!
set ||
cN < 10) {
937 double r = s / f * 100;
950 std::array<double, 4> chisq;
966 for(
int i = 0; i < 4; i++) {
1006 for(
int i = 0; i < 4; i++) {
1007 if((chisq[i] < chimin) && (chisq[i] > 0)) {
1056 for(
int i = 0; i < 4; i++) {
1066 long double sum = 0.;
1067 long double tau = 0.;
1068 long double tau_i = 0.;
1069 long double tau_j = 0.;
1080 if(q >=
cN || q <= 0) {
1087 if(p >=
cN || p <= 0) {
1094 for(
long double& i : par->
am) {
1114 sum = -(
static_cast<double>(q)) / tau + log(1. - exp(-(
static_cast<double>(d - q)) / tau));
1115 sum -= log(1. - exp(-1. / tau));
1120 sum = -(
static_cast<double>(q)) / tau + log(1. - exp(-(
static_cast<double>(d - q)) / tau));
1121 sum -= log(1. - exp(-1. / tau));
1124 for(
int j = i + 1; j <
lineq_dim; j++) {
1126 tau = (tau_i * tau_j) / (tau_i + tau_j);
1127 sum = -(
static_cast<double>(q)) / tau + log(1. - exp(-(
static_cast<double>(d - q)) / tau));
1128 sum -= log(1. - exp(-1. / tau));
1137 for(
int j = q; j <
cN; j++) {
1152 for(
int j = q; j <
cN; j++) {
1157 for(
int j = 0; j < p; j++) {
1180 if(par->
t[0] <= 0) {
1199 if(par->
chisq < 0) {
1209 par->
type = dim - 2;
1214 if(par->
am[i] < 0) {
1255 for(j = i - D; j < i + D; j++) {
1259 if(sum < cWpar->baselineMax) {
1327 return par->
t[i] * par->
t[1] / (par->
t[i] + par->
t[1]);
1374 double tb = wpar->
tmax;
1389 if((fa < 0) && (fb > 0)) {
1392 while(delta >
EPS) {
1393 double slope = -fa / (fb - fa);
1396 slope = std::min(slope, 0.99);
1398 slope = std::max(slope, 0.01);
1402 tc = ta + slope * (tb - ta);
1421 delta = std::abs(fc);
1435 if(!
IsSet()) {
return; }
1469 for(
int t =
cWpar->
t50; t < cWpar->tmax; t++) {
1477 for(
int t =
cWpar->
t50; t > 0; t--) {
1492 t0 = std::max(t0, 0.);
1568 if(exclusion >=
cN) {
return false; }
1572 for(
int j = exclusion; j <
cN; j++) {
1579 double signal = log(
cWavebuffer[j] - baseline) + j / tauDecay;
1588 long double sum = -
static_cast<double>(exclusion) / tauRise + log(1. - exp(-(
static_cast<double>(
cN - exclusion)) / tauRise));
1589 sum -= log(1. - exp(-1. / tauRise));
1593 double tauRise_2 = tauRise / 2.;
1594 sum = -
static_cast<double>(exclusion) / tauRise_2 + log(1. - exp(-(
static_cast<double>(
cN - exclusion)) / tauRise_2));
1595 sum -= log(1. - exp(-1. / tauRise_2));
1612 double dom = exp(((log(alpha) - log(beta)) * tauRise) / tauDecay);
1615 double tt = (log(alpha) - log(beta)) * tauRise;
1616 if(tt > 0) {
cWpar->
t0 = tt; }
1641 g.SetParameter(4, r * 1.05);
1645 g.SetParLimits(1, tauDecay * 0.3, tauDecay * 3.0);
1646 g.SetParLimits(2, tauRise * 0.3, tauRise * 1.5);
1648 g.SetParLimits(4, r * 0.5, r * 2.0);
1651 g.FixParameter(1, tauDecay);
1652 g.FixParameter(2, tauRise);
1653 g.FixParameter(3, baseline);
1656 g.SetParLimits(4, r * 0.1, r * 10.0);
1661 g.ReleaseParameter(5);
1662 g.ReleaseParameter(6);
1663 g.ReleaseParameter(7);
1664 g.SetParameter(5, basefreq);
1665 g.SetParameter(6, 0.5);
1666 g.SetParameter(7, r * 0.1);
1667 g.SetParLimits(5, basefreq * 0.5, basefreq * 2.0);
1668 g.SetParLimits(6, 0, 1);
1669 g.SetParLimits(7, 0, r * 10.0);
1672 int res = h->Fit(&g,
"QN");
1676 cWpar->
t0 = g.GetParameter(0);
1697 double x = i[0] - p[0];
1700 if(x > 0) { s += p[4] * (1 - exp(-x / p[2])) * exp(-x / p[1]); }
1701 if(p[7] > 0) { s += p[7] * sin((p[6] + i[0] / p[5]) * 2 * TMath::Pi()); }
1709 std::ostringstream name;
1723 g.SetLineColor(kRed);
1738 for(Int_t i = 0; i <
cN; i++) {
1740 gsum += abs(g.Eval(i + 0.5));
1741 Smirnov += abs(wsum - gsum);
1749 if(!
set) {
return; }
1751 if(
cWpar !=
nullptr) {
1769 if(
cN == 0 || !
set) {
1772 std::ostringstream name;
1775 TH1I* h =
new TH1I(name.str().c_str(), name.str().c_str(),
cN, -0.5,
cN - 0.5);
1776 for(Int_t i = 0; i <
cN; i++) {
1784 if(
cN == 0 || !
set) {
1787 auto* g =
new TGraph();
1788 for(Int_t i = 0; i <
cN; i++) {
1796 if(
cN == 0 || !
set) {
1802 if(
spar !=
nullptr) {
1803 TF1 f(
"fit",
"[2] + [0]*sin(6.283185307 * (x - [1])/(2*8.48409))", 0,
cN);
1805 f.SetParameter(0,
spar->
A);
1806 f.SetParameter(1,
spar->
t0);
1807 f.SetParameter(2,
spar->
C);
1811 std::cout <<
"t0:\t" <<
spar->
t0 <<
", A:\t" <<
spar->
A <<
", O:\t" <<
spar->
C << std::endl;
1818 if(
cN == 0 || !
set) {
1824 if(
cWpar !=
nullptr) {
1830 g.SetLineColor(kRed);
1840 std::cout <<
"t0:\t" <<
cWpar->
t0 << std::endl;
1847 if(
cN == 0 || !
set) {
1852 if(
cWpar !=
nullptr) {
1859 std::cout <<
"Zero crossing:\t" <<
cWpar->
t0 << std::endl;
1862 f.SetLineColor(kGreen);
1865 g.SetLineColor(kBlue);
1868 h.SetLineColor(kBlack);
1872 r.SetLineColor(kRed);
1889 if(
cWpar !=
nullptr) {
1892 shape.SetParameter(0,
shpar->
t[0]);
1893 shape.SetParameter(1,
shpar->
t[1]);
1894 shape.SetParameter(2,
shpar->
t[2]);
1895 shape.SetParameter(3,
shpar->
t[3]);
1896 shape.SetParameter(4,
shpar->
t[4]);
1897 shape.SetParameter(5,
shpar->
am[0]);
1898 shape.SetParameter(6,
shpar->
am[2]);
1899 shape.SetParameter(7,
shpar->
am[3]);
1900 shape.SetParameter(8,
shpar->
am[4]);
1901 shape.SetLineColor(kRed);
1903 std::cout <<
"t0:\t" <<
shpar->
t[0] <<
",\ttRC:\t" <<
shpar->
t[1] <<
",\ttF:\t" <<
shpar->
t[2] <<
",\ttS:\t" <<
shpar->
t[3] <<
",\tTGamma:\t" <<
shpar->
t[4] << std::endl;
1904 std::cout <<
"Baseline:\t" <<
shpar->
am[0] <<
",\tFast:\t" <<
shpar->
am[2] <<
",\tSlow:\t" <<
shpar->
am[3] <<
",\tGamma:\t" <<
shpar->
am[4] << std::endl;
1906 shape.DrawCopy(
"same");
1914 std::cout <<
"== Currently established waveform parameters ============" << std::endl;
1915 std::cout <<
"baseline : " << std::setw(10) <<
cWpar->
baseline << std::endl;
1916 std::cout <<
"baseline st. dev.: " << std::setw(10) <<
cWpar->
baselineStDev << std::endl;
1917 std::cout <<
"max : " << std::setw(10) <<
cWpar->
max << std::endl;
1918 std::cout <<
"tmax : " << std::setw(10) <<
cWpar->
tmax << std::endl;
1919 std::cout <<
"temin : " << std::setw(10) <<
static_cast<double>(
cWpar->
temin) << std::endl;
1920 std::cout <<
"temax : " << std::setw(10) <<
static_cast<double>(
cWpar->
temax) << std::endl;
1921 std::cout <<
"t0 : " << std::setw(10) <<
cWpar->
t0 << std::endl;
const std::vector< Short_t > * GetWaveform() const
!
virtual bool HasWave() const
!
long double lineq_solution[20]
std::vector< Short_t > cWavebuffer
void GetCsIExclusionZone()
double fit_rf(double=2 *8.48409)
long double determinant(int)
static const int BADCHISQ_PAR_T0
static const int BADCHISQ_LIN_T0
bool GetSiliShapeTF1(double tauDecay, double tauRise, double baseline, double basefreq=0)
static const int CSI_BASELINE_RANGE
static const int BAD_EXCLUSION_ZONE
double GetCsIt0(ShapePar *, WaveFormPar *)
double get_tfrac(double, double, double)
void SetCsI(bool option=true)
static const int BADCHISQ_FAIL_DIRECT
void Clear(Option_t *opt="")
double GetCsITau(int, ShapePar *)
static const int BAD_BASELINE_RANGE
static double SiLiFitFunction(double *i, double *p)
long double copy_matrix[20][20]
ShapePar * csiTestShpar[4]
static const int BADCHISQ_SMOOTH_T0
long double lineq_vector[20]
bool SiliShapePrepare(double tauDecay, double tauRise)
int fit_parabola(int, int, ParPar *)
int fit_line(int, int, LinePar *)
static const int BADCHISQ_AMPL
int fit_smooth_parabola(int, int, double, ParPar *)
static const int MAX_SAMPLES
static const int BADCHISQ_MAT
WaveFormPar * csiTestWpar[4]
long double lineq_matrix[20][20]
virtual ~TPulseAnalyzer()
int FitCsIShape(int, ShapePar *, WaveFormPar *)
double get_parabolic_T0()
static const int NOISE_LEVEL_CSI
static const int BADCHISQ_NEG
static const int BADCHISQ_T0
void SetData(const TFragment &fragment, double=0)
bool GetSiliShape(double tauDecay, double tauRise)
double get_sin_par(double)
Double_t CsIFitFunction(Double_t *time, Double_t *par)