162 std::unique_ptr<TMinuit> gMinuit = std::make_unique<TMinuit>();
166 std::vector<double> pfit(
np, 0), errfit(
np, 0);
167 Double_t **
matrix =
new Double_t *[
np];
169 for (
int i = 0;
i <
np;
i++) {
171 for (
int j = 0; j <
np; j++)
matrix[
i][j] = 0.;
177 MuonFixedId fId(T0h.id);
180 if (T0h.id == 1 || T0h.id == 2 || (T0h.id > 10 && T0h.id <= 23)) isMultilayer = 1;
183 if ((fId.isValid() && fId.is_mdt()) || isMultilayer) {
184 if (
log.level() <= MSG::INFO)
log << MSG::INFO <<
" STARTING doTimeFit " <<
endmsg;
192 if (fitMezz == 1 && !isMultilayer) {
193 int hIdMezz = fId.mdtMezzanine();
196 std::string HistoId(std::string(
"time_mezz_") +
ts((hIdMezz) % (900000000)));
208 T0ClassicHistos *histosMezz =
getHistos(fId.mdtMezzanine());
209 h = histosMezz->time.get();
216 log <<
MSG::VERBOSE <<
" histogram " <<
h->GetName() <<
" " <<
h->GetTitle() <<
" entries=" <<
h->GetEntries()
222 std::unique_ptr<TF1> FitFunction{
h->GetFunction(
"TimeSpectrum")};
224 for (
int i = 0;
i <
np;
i++) {
225 pfit[
i] = FitFunction->GetParameter(
i);
226 errfit[
i] = FitFunction->GetParError(
i);
228 chi2 = FitFunction->GetChisquare();
229 ndof = FitFunction->GetNDF();
231 std::unique_ptr<TF1> TimeSpectrum = std::make_unique<TF1>(
232 "TimeSpectrum",
"[0]+([1]*(1+[2]*exp(-(x-[4])/[3])))/((1+exp((-x+[4])/[6]))*(1+exp((x-[5])/[7]))) ",
234 for (
int i = 0;
i <
np;
i++) {
235 pfit[
i] = pdefault[
i];
237 log <<
MSG::DEBUG <<
"T0CalibrationClassic::doTimeFit initial parameters" <<
i <<
"=" << pfit[
i] <<
endmsg;
241 log <<
MSG::DEBUG <<
"T0CalibrationClassic::doTimeFit parameters after searchParams " <<
endmsg;
244 TimeSpectrum->SetParameters(pfit.data());
245 TimeSpectrum->SetParLimits(0, 0., 5.);
246 TimeSpectrum->SetParLimits(1, 0., 1000.);
247 TimeSpectrum->SetParLimits(2, 0., 40.);
248 TimeSpectrum->SetParLimits(3, 50., 400.);
249 TimeSpectrum->SetParLimits(4, 0., 1000.);
251 TimeSpectrum->SetParLimits(5, pfit[5], pfit[5]);
252 TimeSpectrum->SetParLimits(6, pfit[6], pfit[6]);
253 TimeSpectrum->SetParLimits(7, pfit[7], pfit[7]);
254 h->Fit(
"TimeSpectrum",
"QLB");
256 TimeSpectrum->SetParLimits(5, 500., 2000.);
257 TimeSpectrum->SetParLimits(6, pfit[6], pfit[6]);
258 TimeSpectrum->SetParLimits(7, pfit[7], pfit[7]);
259 h->Fit(
"TimeSpectrum",
"QLB");
261 TimeSpectrum->SetParLimits(6, 4., 30.);
262 h->Fit(
"TimeSpectrum",
"QLB");
264 TimeSpectrum->SetParLimits(6, 4., 30.);
265 TimeSpectrum->SetParLimits(7, 4., 30.);
266 double xmin =
h->GetBinLowEdge(1);
267 double xmax = pfit[5] + 250.;
268 h->Fit(
"TimeSpectrum",
"QLB",
"",
xmin,
xmax);
271 for (
int i = 0;
i <
np;
i++) {
272 pfit[
i] = TimeSpectrum->GetParameter(
i);
273 errfit[
i] = TimeSpectrum->GetParError(
i);
275 chi2 = TimeSpectrum->GetChisquare();
276 ndof = TimeSpectrum->GetNDF();
283 if (
chi2 / ndof < m_settings->chi2max()) {
290 for (
int i = 0;
i <
np;
i++)
fi.par[
i] = pfit[
i];
297 for (
int i = 0;
i <
np;
i++)
fi.cov[
i] = errfit[
i];