10 #include "TVirtualFitter.h"
11 #include "TFitResultPtr.h"
12 #include "TFitResult.h"
17 #include "Math/MinimizerOptions.h"
19 using namespace sistrip;
32 <<
" NULL pointer to base Analysis object!";
41 <<
" NULL pointer to derived Analysis object!";
46 if (!histos.empty()) {
51 std::vector<TH1*>::const_iterator ihis = histos.begin();
53 for (; ihis != histos.end(); ihis++, cnt++) {
67 std::vector<std::string> tokens;
69 std::istringstream tokenStream(
title.extraInfo());
70 while (std::getline(tokenStream, token,
'_')) {
71 tokens.push_back(token);
76 histo_temp.first = *ihis;
77 histo_temp.second = (*ihis)->GetTitle();
78 histo_temp.first->Sumw2();
79 histo_.push_back(histo_temp);
81 stripId_.push_back(std::stoi(tokens.at(1)) * 16 + std::stoi(tokens.at(3)));
82 calChan_.push_back(std::stoi(tokens.at(1)));
89 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Minuit2",
"Migrad");
90 ROOT::Math::MinimizerOptions::SetDefaultStrategy(0);
94 <<
" NULL pointer to derived Analysis object!";
98 float Amean[2] = {-1., -1.};
99 float Amin[2] = {-1., -1.};
100 float Amax[2] = {-1., -1.};
101 float Aspread[2] = {-1., -1.};
102 float Tmean[2] = {-1., -1.};
103 float Tmin[2] = {-1., -1.};
104 float Tmax[2] = {-1., -1.};
105 float Tspread[2] = {-1., -1.};
106 float Rmean[2] = {-1., -1.};
107 float Rmin[2] = {-1., -1.};
108 float Rmax[2] = {-1., -1.};
109 float Rspread[2] = {-1., -1.};
110 float Cmean[2] = {-1., -1.};
111 float Cmin[2] = {-1., -1.};
112 float Cmax[2] = {-1., -1.};
113 float Cspread[2] = {-1., -1.};
114 float Smean[2] = {-1., -1.};
115 float Smin[2] = {-1., -1.};
116 float Smax[2] = {-1., -1.};
117 float Sspread[2] = {-1., -1.};
118 float Kmean[2] = {-1., -1.};
119 float Kmin[2] = {-1., -1.};
120 float Kmax[2] = {-1., -1.};
121 float Kspread[2] = {-1., -1.};
123 float Omean[2] = {-1., -1.};
124 float Omin[2] = {-1., -1.};
125 float Omax[2] = {-1., -1.};
126 float Ospread[2] = {-1., -1.};
128 float Mmean[2] = {-1., -1.};
129 float Mmin[2] = {-1., -1.};
130 float Mmax[2] = {-1., -1.};
131 float Mspread[2] = {-1., -1.};
133 float Umean[2] = {-1., -1.};
134 float Umin[2] = {-1., -1.};
135 float Umax[2] = {-1., -1.};
136 float Uspread[2] = {-1., -1.};
138 float Bmean[2] = {-1., -1.};
139 float Bmin[2] = {-1., -1.};
140 float Bmax[2] = {-1., -1.};
141 float Bspread[2] = {-1., -1.};
144 TFitResultPtr fit_result;
145 TF1* fit_function =
nullptr;
147 fit_function =
new TF1(
"fit_function_deco",
fdeconv, 0, 400, 7);
148 fit_function->SetParameters(4, 25, 25, 50, 250, 25, 0.75);
150 fit_function =
new TF1(
"fit_function_peak",
fpeak, 0, 400, 6);
151 fit_function->SetParameters(4, 50, 50, 70, 250, 20);
155 std::vector<unsigned int>
nStrips(2, 0.);
157 for (
size_t ihist = 0; ihist <
histo_.size(); ihist++) {
175 if (
histo_[ihist].first->Integral() == 0) {
184 float error =
histo_[ihist].first->GetMaximum() * 0.05;
185 for (
int i = 1;
i <=
histo_[ihist].first->GetNbinsX(); ++
i)
186 histo_[ihist].first->SetBinError(
i, error);
190 fit_function->SetParameters(10, 15, 30, 10, 350, 50, 0.75);
192 fit_function->SetParameters(6, 40, 40, 70, 350, 20);
194 fit_result =
histo_[ihist].first->Fit(fit_function,
"QS");
197 if (not fit_result.Get())
200 float maximum_ampl = fit_function->GetMaximum();
201 float peak_time = fit_function->GetMaximumX();
202 float baseline =
baseLine(fit_function);
203 float turn_on_time =
turnOn(fit_function, baseline);
204 float rise_time = peak_time - turn_on_time;
213 if (
cal_->
deconv_ and fit_function->GetMinimumX() > peak_time)
215 100 * (fit_function->GetMinimum() - baseline) / (maximum_ampl - baseline);
220 int lastBin =
histo_[ihist].first->FindBin(peak_time + 125);
221 if (lastBin >
histo_[ihist].first->GetNbinsX() - 4)
222 lastBin =
histo_[ihist].first->GetNbinsX() - 4;
226 100 * (
histo_[ihist].first->GetBinContent(lastBin) - baseline) / (maximum_ampl - baseline);
232 fit_function->GetChisquare() / (
histo_[ihist].first->GetNbinsX() - fit_function->GetNpar());
267 if (fit_function->GetMinimumX() < peak_time)
317 Amean[apvId_[ihist]] +=
cal_->
amplitude_[apvId_[ihist]][stripId_[ihist]];
318 Amin[apvId_[ihist]] = Amin[apvId_[ihist]] <
cal_->
amplitude_[apvId_[ihist]][stripId_[ihist]]
319 ? Amin[apvId_[ihist]]
321 Amax[apvId_[ihist]] = Amax[apvId_[ihist]] >
cal_->
amplitude_[apvId_[ihist]][stripId_[ihist]]
322 ? Amax[apvId_[ihist]]
324 Aspread[apvId_[ihist]] +=
327 Tmean[apvId_[ihist]] +=
cal_->
tail_[apvId_[ihist]][stripId_[ihist]];
328 Tmin[apvId_[ihist]] = Tmin[apvId_[ihist]] <
cal_->
tail_[apvId_[ihist]][stripId_[ihist]]
329 ? Tmin[apvId_[ihist]]
330 :
cal_->
tail_[apvId_[ihist]][stripId_[ihist]];
331 Tmax[apvId_[ihist]] = Tmax[apvId_[ihist]] >
cal_->
tail_[apvId_[ihist]][stripId_[ihist]]
332 ? Tmax[apvId_[ihist]]
333 :
cal_->
tail_[apvId_[ihist]][stripId_[ihist]];
334 Tspread[apvId_[ihist]] +=
cal_->
tail_[apvId_[ihist]][stripId_[ihist]] *
cal_->
tail_[apvId_[ihist]][stripId_[ihist]];
336 Rmean[apvId_[ihist]] +=
cal_->
riseTime_[apvId_[ihist]][stripId_[ihist]];
337 Rmin[apvId_[ihist]] = Rmin[apvId_[ihist]] <
cal_->
riseTime_[apvId_[ihist]][stripId_[ihist]]
338 ? Rmin[apvId_[ihist]]
340 Rmax[apvId_[ihist]] = Rmax[apvId_[ihist]] >
cal_->
riseTime_[apvId_[ihist]][stripId_[ihist]]
341 ? Rmax[apvId_[ihist]]
343 Rspread[apvId_[ihist]] +=
346 Cmean[apvId_[ihist]] +=
cal_->
decayTime_[apvId_[ihist]][stripId_[ihist]];
347 Cmin[apvId_[ihist]] = Cmin[apvId_[ihist]] <
cal_->
decayTime_[apvId_[ihist]][stripId_[ihist]]
348 ? Cmin[apvId_[ihist]]
350 Cmax[apvId_[ihist]] = Cmax[apvId_[ihist]] >
cal_->
decayTime_[apvId_[ihist]][stripId_[ihist]]
351 ? Cmax[apvId_[ihist]]
353 Cspread[apvId_[ihist]] +=
356 Smean[apvId_[ihist]] +=
cal_->
smearing_[apvId_[ihist]][stripId_[ihist]];
357 Smin[apvId_[ihist]] = Smin[apvId_[ihist]] <
cal_->
smearing_[apvId_[ihist]][stripId_[ihist]]
358 ? Smin[apvId_[ihist]]
360 Smax[apvId_[ihist]] = Smax[apvId_[ihist]] >
cal_->
smearing_[apvId_[ihist]][stripId_[ihist]]
361 ? Smax[apvId_[ihist]]
363 Sspread[apvId_[ihist]] +=
366 Kmean[apvId_[ihist]] +=
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]];
367 Kmin[apvId_[ihist]] = Kmin[apvId_[ihist]] <
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]]
368 ? Kmin[apvId_[ihist]]
369 :
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]];
370 Kmax[apvId_[ihist]] = Kmax[apvId_[ihist]] >
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]]
371 ? Kmax[apvId_[ihist]]
372 :
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]];
373 Kspread[apvId_[ihist]] +=
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]] *
cal_->
chi2_[apvId_[ihist]][stripId_[ihist]];
375 Omean[apvId_[ihist]] +=
cal_->
turnOn_[apvId_[ihist]][stripId_[ihist]];
376 Omin[apvId_[ihist]] = Omin[apvId_[ihist]] <
cal_->
turnOn_[apvId_[ihist]][stripId_[ihist]]
377 ? Omin[apvId_[ihist]]
379 Omax[apvId_[ihist]] = Omax[apvId_[ihist]] >
cal_->
turnOn_[apvId_[ihist]][stripId_[ihist]]
380 ? Omax[apvId_[ihist]]
382 Ospread[apvId_[ihist]] +=
385 Mmean[apvId_[ihist]] +=
cal_->
peakTime_[apvId_[ihist]][stripId_[ihist]];
386 Mmin[apvId_[ihist]] = Mmin[apvId_[ihist]] <
cal_->
peakTime_[apvId_[ihist]][stripId_[ihist]]
387 ? Mmin[apvId_[ihist]]
389 Mmax[apvId_[ihist]] = Mmax[apvId_[ihist]] >
cal_->
peakTime_[apvId_[ihist]][stripId_[ihist]]
390 ? Mmax[apvId_[ihist]]
392 Mspread[apvId_[ihist]] +=
395 Umean[apvId_[ihist]] +=
cal_->
undershoot_[apvId_[ihist]][stripId_[ihist]];
396 Umin[apvId_[ihist]] = Umin[apvId_[ihist]] <
cal_->
undershoot_[apvId_[ihist]][stripId_[ihist]]
397 ? Umin[apvId_[ihist]]
399 Umax[apvId_[ihist]] = Umax[apvId_[ihist]] >
cal_->
undershoot_[apvId_[ihist]][stripId_[ihist]]
400 ? Umax[apvId_[ihist]]
402 Uspread[apvId_[ihist]] +=
405 Bmean[apvId_[ihist]] +=
cal_->
baseline_[apvId_[ihist]][stripId_[ihist]];
406 Bmin[apvId_[ihist]] = Bmin[apvId_[ihist]] <
cal_->
baseline_[apvId_[ihist]][stripId_[ihist]]
407 ? Bmin[apvId_[ihist]]
409 Bmax[apvId_[ihist]] = Bmax[apvId_[ihist]] >
cal_->
baseline_[apvId_[ihist]][stripId_[ihist]]
410 ? Bmax[apvId_[ihist]]
412 Bspread[apvId_[ihist]] +=
417 for (
int i = 0;
i < 2;
i++) {
418 if (nStrips[
i] != 0) {
419 Amean[
i] = Amean[
i] / nStrips[
i];
420 Tmean[
i] = Tmean[
i] / nStrips[
i];
421 Rmean[
i] = Rmean[
i] / nStrips[
i];
422 Cmean[
i] = Cmean[
i] / nStrips[
i];
423 Omean[
i] = Omean[
i] / nStrips[
i];
424 Mmean[
i] = Mmean[
i] / nStrips[
i];
425 Umean[
i] = Umean[
i] / nStrips[
i];
426 Bmean[
i] = Bmean[
i] / nStrips[
i];
427 Smean[
i] = Smean[
i] / nStrips[
i];
428 Kmean[
i] = Kmean[
i] / nStrips[
i];
430 Aspread[
i] = Aspread[
i] / nStrips[
i];
431 Tspread[
i] = Tspread[
i] / nStrips[
i];
432 Rspread[
i] = Rspread[
i] / nStrips[
i];
433 Cspread[
i] = Cspread[
i] / nStrips[
i];
434 Ospread[
i] = Ospread[
i] / nStrips[
i];
435 Mspread[
i] = Mspread[
i] / nStrips[
i];
436 Uspread[
i] = Uspread[
i] / nStrips[
i];
437 Bspread[
i] = Bspread[
i] / nStrips[
i];
438 Sspread[
i] = Sspread[
i] / nStrips[
i];
439 Kspread[
i] = Kspread[
i] / nStrips[
i];
444 for (
int i = 0;
i < 2; ++
i) {
497 for (
int iBin = 0; iBin < histo->GetNbinsX(); iBin++) {
498 histo->SetBinContent(iBin + 1, -histo->GetBinContent(iBin + 1) / 20.);
507 float x = f->GetXmin();
508 for (; x <
xmax; x += 0.1) {
509 baseline += f->Eval(x);
517 const float& baseline) {
518 float max_amplitude = f->GetMaximum();
520 for (; time < 100 && (f->Eval(time) - baseline) < 0.05 * (max_amplitude - baseline); time += 0.1) {
528 float xval = f->GetMaximumX();
529 float max_amplitude = f->GetMaximum();
531 for (; x < 1000; x = x + 0.1) {
532 if (f->Eval(x) < max_amplitude *
exp(-1))
static const char unexpectedTask_[]
static const float minRiseTimeThresholdDeco_
static const float maxTurnOnThreshold_
static const float maxRiseTimeThresholdDeco_
static const float minPeakTimeThreshold_
static const float maxDecayTimeThresholdDeco_
const uint32_t & fedKey() const
Utility class that holds histogram title.
static const float maxRiseTimeThreshold_
void extract(const std::vector< TH1 * > &) override
static const float maxBaselineThreshold_
std::vector< int > calChan_
Exp< T >::type exp(const T &t)
tuple nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
CalibrationAnalysis * cal_
static const float minDecayTimeThresholdDeco_
uint32_t extractFedKey(const TH1 *const)
static const float minAmplitudeThreshold_
static const float maxDecayTimeThreshold_
Analysis for calibration runs.
static const float minTurnOnThresholdDeco_
static const float minDecayTimeThreshold_
static const char mlCommissioning_[]
std::vector< int > apvId_
static const float minPeakTimeThresholdDeco_
virtual void addErrorCode(const std::string &error)
static const float minBaselineThreshold_
std::vector< Histo > histo_
static const float maxTurnOnThresholdDeco_
VFloat spread_undershoot_
std::vector< int > stripId_
static const float minRiseTimeThreshold_
double fdeconv(double *x, double *par)
std::pair< TH1 *, std::string > Histo
void correctDistribution(TH1 *) const
static const float minTurnOnThreshold_
static const float maxChi2Threshold_
static const float maxPeakTimeThresholdDeco_
double fpeak(double *x, double *par)
float turnOn(TF1 *, const float &)
static const float maxPeakTimeThreshold_
const double Rmax[kNumberCalorimeter]
Abstract base for derived classes that provide analysis of commissioning histograms.
Log< level::Warning, false > LogWarning
const double Rmin[kNumberCalorimeter]
CommissioningAnalysis *const anal() const