17 : fName(std::move(name))
105 for(
int i = 0; i < m; i++) {
112 for(
int j = m - 2; j >= 0; j--) {
113 for(
int i = 0; i < m; i++) {
126 memset(pp, 0,
sizeof(
ParPar));
132 int k =
static_cast<int>(rint(x0));
134 for(
int i = low; i < k; i++) {
141 for(
int i = k; i < high; i++) {
142 double x = (i - x0) * (i - x0);
175 if(!
set ||
cN < 10) {
193 if(!
set ||
cN < 10) {
201 std::array<double, 3> chisq;
202 std::array<WaveFormPar, 3> w;
216 for(
double& i : chisq) {
222 memcpy(w.data(),
cWpar, swp);
224 memcpy(&w[1],
cWpar, swp);
226 memcpy(&w[2],
cWpar, swp);
231 for(
int i = 0; i < 3; i++) {
232 if(chisq[i] < chimin && chisq[i] > 0) {
239 memcpy(
cWpar, &w[imin], swp);
250 memset(pp, 0,
sizeof(
ParPar));
256 for(
int i = low; i < high; i++) {
291 memset(lp, 0,
sizeof(
LinePar));
297 for(
int i = low; i < high; i++) {
362 if(t < cN && t > 0) {
383 memset(&ppmin, 0,
sizeof(
ParPar));
401 for(t = kmin - 1; t < kmin + 1; t += 0.1) {
405 memcpy(&ppmin, &pp,
sizeof(
ParPar));
411 memcpy(&pp, &ppmin,
sizeof(
ParPar));
422 if(t < cN && t > 0) {
466 d = b * b - 4 * a * c;
476 t = 0.5 * (-b + d) / a;
486 if(t < cN && t > 0) {
504 std::cout <<
"Baseline range (" <<
cWpar->
baseline_range <<
") larger than waveform length!" << std::endl;
505 std::cout <<
"Terminating program" << std::endl;
534 if(
cN > tb && tb > 0) {
535 for(
int i = 0; i < tb; i++) {
562 for(i = D; i <
cN - D; i++) {
564 for(j = i - D; j < i + D; j++) {
581 std::cout <<
"Baseline not deterimned for the tfraction" << std::endl;
586 std::cout <<
"Maximum not deterimned for the tfraction" << std::endl;
652 for(i = imin; i < imax + 1; i++) {
667 double d = q * q - 4 * r * p;
756 w = 2 * TMath::Pi() / T;
760 snm = sin((
cN - 1) * w);
762 s2n = sin(2 *
cN * w);
763 s2nm = sin(2 * (
cN - 1) * w);
767 cnm = cos((
cN - 1) * w);
769 c2n = cos(2 *
cN * w);
770 c2nm = cos(2 * (
cN - 1) * w);
772 lineq_matrix[0][0] = 0.5 *
cN - 0.25 * (1 - c2 - c2n + c2nm) / (1 - c2);
773 lineq_matrix[0][1] = 0.25 * (s2 + s2nm - s2n) / (1 - c2);
777 lineq_matrix[1][1] = 0.5 *
cN + 0.25 * (1 - c2 - c2n + c2nm) / (1 - c2);
778 lineq_matrix[1][2] = 0.5 * (1 - c - cn + cnm) / (1 - c);
786 for(
int i = 0; i <
cN; i++) {
801 spar->
t0 = acos(c) * T / (2 * TMath::Pi());
803 spar->
t0 = (1 - acos(c) / (2 * TMath::Pi())) * T;
872 if(!
set ||
cN < 10) {
900 double r =
s / f * 100;
904 if(!
set ||
cN < 10) {
936 double r =
s / f * 100;
949 std::array<double, 4> chisq;
965 for(
int i = 0; i < 4; i++) {
1005 for(
int i = 0; i < 4; i++) {
1006 if((chisq[i] < chimin) && (chisq[i] > 0)) {
1055 for(
int i = 0; i < 4; i++) {
1065 long double sum = 0.;
1066 long double tau = 0.;
1067 long double tau_i = 0.;
1068 long double tau_j = 0.;
1079 if(q >=
cN || q <= 0) {
1086 if(p >=
cN || p <= 0) {
1093 for(
long double& i : par->
am) {
1113 sum = -(
static_cast<double>(q)) / tau + log(1. - exp(-(
static_cast<double>(d - q)) / tau));
1114 sum -= log(1. - exp(-1. / tau));
1119 sum = -(
static_cast<double>(q)) / tau + log(1. - exp(-(
static_cast<double>(d - q)) / tau));
1120 sum -= log(1. - exp(-1. / tau));
1123 for(
int j = i + 1; j <
lineq_dim; j++) {
1125 tau = (tau_i * tau_j) / (tau_i + tau_j);
1126 sum = -(
static_cast<double>(q)) / tau + log(1. - exp(-(
static_cast<double>(d - q)) / tau));
1127 sum -= log(1. - exp(-1. / tau));
1136 for(
int j = q; j <
cN; j++) {
1151 for(
int j = q; j <
cN; j++) {
1156 for(
int j = 0; j < p; j++) {
1179 if(par->
t[0] <= 0) {
1198 if(par->
chisq < 0) {
1208 par->
type = dim - 2;
1213 if(par->
am[i] < 0) {
1254 for(j = i - D; j < i + D; j++) {
1258 if(sum < cWpar->baselineMax) {
1328 return par->
t[i] * par->
t[1] / (par->
t[i] + par->
t[1]);
1375 double tb = wpar->
tmax;
1390 if((fa < 0) && (fb > 0)) {
1393 while(delta >
EPS) {
1394 double slope = -fa / (fb - fa);
1407 tc = ta + slope * (tb - ta);
1426 delta = std::abs(fc);
1440 if(!
IsSet()) {
return; }
1474 for(
int t =
cWpar->
t50; t < cWpar->tmax; t++) {
1482 for(
int t =
cWpar->
t50; t > 0; t--) {
1497 if(t0 < 0.) { t0 = 0.; }
1573 if(exclusion >=
cN) {
return false; }
1577 for(
int j = exclusion; j <
cN; j++) {
1584 double signal = log(
cWavebuffer[j] - baseline) + j / tauDecay;
1593 long double sum = -
static_cast<double>(exclusion) / tauRise + log(1. - exp(-(
static_cast<double>(
cN - exclusion)) / tauRise));
1594 sum -= log(1. - exp(-1. / tauRise));
1598 double tauRise_2 = tauRise / 2.;
1599 sum = -
static_cast<double>(exclusion) / tauRise_2 + log(1. - exp(-(
static_cast<double>(
cN - exclusion)) / tauRise_2));
1600 sum -= log(1. - exp(-1. / tauRise_2));
1617 double dom = exp(((log(alpha) - log(beta)) * tauRise) / tauDecay);
1620 double tt = (log(alpha) - log(beta)) * tauRise;
1621 if(tt > 0) {
cWpar->
t0 = tt; }
1646 g.SetParameter(4, r * 1.05);
1650 g.SetParLimits(1, tauDecay * 0.3, tauDecay * 3.0);
1651 g.SetParLimits(2, tauRise * 0.3, tauRise * 1.5);
1653 g.SetParLimits(4, r * 0.5, r * 2.0);
1656 g.FixParameter(1, tauDecay);
1657 g.FixParameter(2, tauRise);
1658 g.FixParameter(3, baseline);
1661 g.SetParLimits(4, r * 0.1, r * 10.0);
1666 g.ReleaseParameter(5);
1667 g.ReleaseParameter(6);
1668 g.ReleaseParameter(7);
1669 g.SetParameter(5, basefreq);
1670 g.SetParameter(6, 0.5);
1671 g.SetParameter(7, r * 0.1);
1672 g.SetParLimits(5, basefreq * 0.5, basefreq * 2.0);
1673 g.SetParLimits(6, 0, 1);
1674 g.SetParLimits(7, 0, r * 10.0);
1677 int res = h->Fit(&g,
"QN");
1681 cWpar->
t0 = g.GetParameter(0);
1702 double x = i[0] - p[0];
1705 if(x > 0) {
s += p[4] * (1 - exp(-x / p[2])) * exp(-x / p[1]); }
1706 if(p[7] > 0) {
s += p[7] * sin((p[6] + i[0] / p[5]) * 2 * TMath::Pi()); }
1714 std::ostringstream name;
1728 g.SetLineColor(kRed);
1743 for(Int_t i = 0; i <
cN; i++) {
1745 gsum += abs(g.Eval(i + 0.5));
1746 Smirnov += abs(wsum - gsum);
1754 if(!
set) {
return; }
1756 if(
cWpar !=
nullptr) {
1774 if(
cN == 0 || !
set) {
1777 std::ostringstream name;
1780 TH1I* h =
new TH1I(name.str().c_str(), name.str().c_str(),
cN, -0.5,
cN - 0.5);
1781 for(Int_t i = 0; i <
cN; i++) {
1789 if(
cN == 0 || !
set) {
1792 auto* g =
new TGraph();
1793 for(Int_t i = 0; i <
cN; i++) {
1801 if(
cN == 0 || !
set) {
1807 if(
spar !=
nullptr) {
1808 TF1 f(
"fit",
"[2] + [0]*sin(6.283185307 * (x - [1])/(2*8.48409))", 0,
cN);
1810 f.SetParameter(0,
spar->
A);
1811 f.SetParameter(1,
spar->
t0);
1812 f.SetParameter(2,
spar->
C);
1816 std::cout <<
"t0:\t" <<
spar->
t0 <<
", A:\t" <<
spar->
A <<
", O:\t" <<
spar->
C << std::endl;
1823 if(
cN == 0 || !
set) {
1829 if(
cWpar !=
nullptr) {
1835 g.SetLineColor(kRed);
1845 std::cout <<
"t0:\t" <<
cWpar->
t0 << std::endl;
1852 if(
cN == 0 || !
set) {
1857 if(
cWpar !=
nullptr) {
1864 std::cout <<
"Zero crossing:\t" <<
cWpar->
t0 << std::endl;
1867 f.SetLineColor(kGreen);
1870 g.SetLineColor(kBlue);
1873 h.SetLineColor(kBlack);
1877 r.SetLineColor(kRed);
1894 if(
cWpar !=
nullptr) {
1897 shape.SetParameter(0,
shpar->
t[0]);
1898 shape.SetParameter(1,
shpar->
t[1]);
1899 shape.SetParameter(2,
shpar->
t[2]);
1900 shape.SetParameter(3,
shpar->
t[3]);
1901 shape.SetParameter(4,
shpar->
t[4]);
1902 shape.SetParameter(5,
shpar->
am[0]);
1903 shape.SetParameter(6,
shpar->
am[2]);
1904 shape.SetParameter(7,
shpar->
am[3]);
1905 shape.SetParameter(8,
shpar->
am[4]);
1906 shape.SetLineColor(kRed);
1908 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;
1909 std::cout <<
"Baseline:\t" <<
shpar->
am[0] <<
",\tFast:\t" <<
shpar->
am[2] <<
",\tSlow:\t" <<
shpar->
am[3] <<
",\tGamma:\t" <<
shpar->
am[4] << std::endl;
1911 shape.DrawCopy(
"same");
1919 std::cout <<
"== Currently established waveform parameters ============" << std::endl;
1920 std::cout <<
"baseline : " << std::setw(10) <<
cWpar->
baseline << std::endl;
1921 std::cout <<
"baseline st. dev.: " << std::setw(10) <<
cWpar->
baselineStDev << std::endl;
1922 std::cout <<
"max : " << std::setw(10) <<
cWpar->
max << std::endl;
1923 std::cout <<
"tmax : " << std::setw(10) <<
cWpar->
tmax << std::endl;
1924 std::cout <<
"temin : " << std::setw(10) <<
static_cast<double>(
cWpar->
temin) << std::endl;
1925 std::cout <<
"temax : " << std::setw(10) <<
static_cast<double>(
cWpar->
temax) << std::endl;
1926 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)