6 #include <FairLogger.h>
7 #include <FairParSet.h>
9 #include <FairRuntimeDb.h>
11 #include <Math/WrappedMultiTF1.h>
17 #include <HFitInterface.h>
19 #include <Fit/BinData.h>
20 #include <Fit/DataOptions.h>
21 #include <Fit/DataRange.h>
22 #include <Fit/FitConfig.h>
23 #include <Fit/Fitter.h>
35 auto fPar =
dynamic_cast<AtDigiPar *
>(FairRun::Instance()->GetRuntimeDb()->getContainer(
"AtDigiPar"));
42 auto maxTB = std::max_element(begin(charge), end(charge));
43 auto zTB =
static_cast<double>(std::distance(begin(charge), maxTB));
49 auto longDiff = std::sqrt(2 *
fDiffLong * driftTime);
51 auto sigTB = sigTime /
fTBTime * 1000.;
54 LOG(debug) <<
"zTB: " << zTB <<
" zTime " << driftTime <<
" sigTB: " << sigTB <<
" Amp: " << *maxTB;
57 LOG(debug) <<
"Skipping pad: " << *maxTB <<
" below threshold or " << zTB
58 <<
" outside initial guess for hit TB is outside valid range (20,500).";
63 auto id = std::hash<std::thread::id>{}(std::this_thread::get_id());
67 fHist = ContainerManip::CreateHistFromData<TH1F>(TString::Format(
"%lu",
id).Data(), charge);
70 auto fitRange = 3 * sigTB + 2;
74 TF1
gauss(TString::Format(
"fitGauss%lu",
id),
"gaus(0)", zTB - fitRange, zTB + fitRange, TF1::EAddToList::kNo);
75 gauss.SetParameter(0, *maxTB);
76 gauss.SetParameter(1, zTB);
77 gauss.SetParameter(2, sigTB);
82 if (!result.IsValid()) {
83 LOG(info) <<
"Fit did not converge using initial conditions:"
84 <<
" mean: " << zTB <<
" sig:" << sigTB <<
" max:" << *maxTB;
88 auto amp = result.GetParams()[0];
89 auto z = result.GetParams()[1];
90 auto sig = result.GetParams()[2];
92 auto Q = amp * sig * std::sqrt(2 * TMath::Pi());
93 LOG(debug) <<
"Initial: " << *maxTB <<
" " << zTB <<
" " << sigTB;
94 LOG(debug) <<
"Fit: " << amp <<
" " << z <<
" " << sig;
96 return {{z, sig * sig, Q, 0}};
102 double xmin = 0, xmax = 0;
103 func.GetRange(xmin, xmax);
104 ROOT::Fit::DataOptions opt;
106 ROOT::Fit::DataRange range(xmin, xmax);
107 ROOT::Fit::BinData d(opt, range);
108 ROOT::Fit::FillData(d, &hist);
111 ROOT::Math::WrappedMultiTF1 wf(func);
113 ROOT::Fit::Fitter fFitter;
114 fFitter.Config().SetMinimizer(
"Minuit2");
115 fFitter.SetFunction(wf,
false);
117 bool goodFit = fFitter.Fit(d);
119 return fFitter.Result();