4 const double massSqP = 0.88;
5 const double massSqK = 0.24;
6 const double massSqD = 3.52;
10 vector<TF1*> GetProtonKaonDeuteronCombinedFits(TH1D * hMassSq_ProtonKaonDeuteron)
19 double nData = hMassSq_ProtonKaonDeuteron->GetEntries();
21 double massDelta = 0.05;
22 double massSqDDelta = 0.4;
23 double m2_sig1 = 0.15;
24 double m2_sig1_min = 0.10;
25 double m2_sig1_max = 0.20;
26 double m2_sig2 = 0.50;
27 double m2_sig2_min = 0.20;
28 double m2_sig2_max = 5.50;
29 gErrorIgnoreLevel = kFatal;
32 TF1 * FitK =
new TF1(
"FitK",
"[0]*([1]*TMath::Gaus(x, [2], [3]) + (1-[1])*TMath::Gaus(x, [2], [4]))", -5, 5);
33 FitK->SetParameters(2000, 0.5, massSqK, m2_sig1, m2_sig2);
34 FitK->SetParLimits(0, 1, nData);
35 FitK->SetParLimits(1, 0, 1);
36 FitK->SetParLimits(2, massSqK-massDelta, massSqK+massDelta);
37 FitK->SetParLimits(3, m2_sig1_min, m2_sig1_max);
38 FitK->SetParLimits(4, m2_sig2_min, m2_sig2_max);
39 hMassSq_ProtonKaonDeuteron->Fit(FitK,
"NQ",
"", -5, 5);
41 TF1 * FitP =
new TF1(
"FitP",
"[0]*([1]*TMath::Gaus(x, [2], [3]) + (1-[1])*TMath::Gaus(x, [2], [4]))", -5, 5);
42 FitP->SetParameters(2000, 0.5, massSqP, m2_sig1, m2_sig2);
43 FitP->SetParLimits(0, 0, nData);
44 FitP->SetParLimits(1, 0, 1);
45 FitP->SetParLimits(2, massSqP-massDelta, massSqP+massDelta);
46 FitP->SetParLimits(3, m2_sig1_min, m2_sig1_max);
47 FitP->SetParLimits(4, m2_sig2_min, m2_sig2_max);
48 hMassSq_ProtonKaonDeuteron->Fit(FitP,
"NQ",
"", -5, 5);
50 TF1 * FitD =
new TF1(
"FitD",
"[0]*([1]*TMath::Gaus(x, [2], [3]) + (1-[1])*TMath::Gaus(x, [2], [4]))", -5, 5);
51 FitD->SetParameters(10, 0.5, massSqD, 2*m2_sig1, 2*m2_sig2);
52 FitD->SetParLimits(0, 0, nData/10);
53 FitD->SetParLimits(1, 0, 1);
54 FitD->SetParLimits(2, massSqD-massSqDDelta, massSqD+massSqDDelta);
55 FitD->SetParLimits(3, m2_sig1_min/2, 2*m2_sig1_max);
56 FitD->SetParLimits(4, m2_sig2_min/2, 2*m2_sig2_max);
57 hMassSq_ProtonKaonDeuteron->Fit(FitD,
"NQ",
"", -5, 5);
60 TF1 * FitT =
new TF1(
"FitT",
"[0]*([1]*TMath::Gaus(x, [2], [3]) + (1-[1])*TMath::Gaus(x, [2], [4])) + [5]*([6]*TMath::Gaus(x, [7], [8]) + (1-[6])*TMath::Gaus(x, [7], [9])) + [10]*([11]*TMath::Gaus(x, [12], [13]) + (1-[11])*TMath::Gaus(x, [12], [14]))", -5, 5);
81 double guessParam[15];
82 FitK->GetParameters(&guessParam[0]);
83 FitP->GetParameters(&guessParam[5]);
84 FitD->GetParameters(&guessParam[10]);
85 FitT->SetParameters(guessParam);
89 FitT->SetParLimits(0, 1, nData);
90 FitT->SetParLimits(1, 0, 1);
91 FitT->SetParLimits(2, massSqK-massDelta, massSqK+massDelta);
92 FitT->SetParLimits(3, m2_sig1_min, m2_sig1_max);
93 FitT->SetParLimits(4, m2_sig2_min, m2_sig2_max);
95 FitT->SetParLimits(5, 1, nData);
96 FitT->SetParLimits(6, 0, 1);
97 FitT->SetParLimits(7, massSqP-massDelta, massSqP+massDelta);
98 FitT->SetParLimits(8, m2_sig1_min, m2_sig1_max);
99 FitT->SetParLimits(9, m2_sig2_min, m2_sig2_max);
101 FitT->SetParLimits(10, 1, nData/100);
102 FitT->SetParLimits(11, 0, 1);
103 FitT->SetParLimits(12, massSqD-massDelta, massSqD+massDelta);
104 FitT->SetParLimits(13, m2_sig1_min/2, 2*m2_sig1_max);
105 FitT->SetParLimits(14, m2_sig2_min/2, 3*m2_sig2_max);
108 hMassSq_ProtonKaonDeuteron->Fit(FitT,
"NQ",
"", -5, 5);
113 if (FitT->GetParameter(14) >= 3*m2_sig2_max)
114 cout<<
"======================> Deuteron sigma-2: "<<FitT->GetParameter(14)<<endl;
116 cout<<
"Deuteron sigma-2: "<<FitT->GetParameter(14)<<endl;
117 cout<<
"Ratio sigma-1 proton/kaon: "<<FitT->GetParameter(8)/FitT->GetParameter(3)<<endl;
123 FitT->GetParameters(fitParam);
124 FitK->SetParameters(&fitParam[0]);
125 FitP->SetParameters(&fitParam[5]);
126 FitD->SetParameters(&fitParam[10]);
127 gErrorIgnoreLevel = kInfo;
130 vector<TF1*> vFits = {FitT, FitK, FitP, FitD};
139 TH1D * GetParticleHistogramFromPionData(
const TH1D * hMassSq_Pion,
double particle_mass)
142 TH1D * h = (TH1D*)hMassSq_Pion->Clone();
145 const int ibinPionPeak = hMassSq_Pion->GetMaximumBin();
146 const int iParticlePeak = hMassSq_Pion->GetXaxis()->FindBin(particle_mass);
148 int shift = iParticlePeak - ibinPionPeak + 1;
149 if (fabs(particle_mass - massSqK) < 0.01) shift = shift - 1;
151 for (
int i = 1; i <= hMassSq_Pion->GetNbinsX(); i++)
153 if (hMassSq_Pion->GetBinContent(i - shift) >= 0 && (i - shift) >= 0)
154 h->SetBinContent(i, hMassSq_Pion->GetBinContent(i - shift));
156 h->SetBinContent(i, 0);
159 h->SetBinContent(h->GetNbinsX()+1, 0);
167 TH1D * GetBroadenedParticleHistogramFromPionData(
const TH1D * hMassSq_Pion,
double particle_mass,
double width)
170 TH1D * hZeroed = (TH1D*)hMassSq_Pion->Clone();
173 const int ibinPionPeak = hMassSq_Pion->GetMaximumBin();
174 const int iBinZeroMass = hMassSq_Pion->GetXaxis()->FindBin(0);
175 int shift_left = ibinPionPeak - iBinZeroMass;
177 for (
int i = 1; i <= hMassSq_Pion->GetNbinsX(); i++)
179 if (hMassSq_Pion->GetBinContent(i + shift_left) >= 0 && (i + shift_left) >= 0)
180 hZeroed->SetBinContent(i, hMassSq_Pion->GetBinContent(i + shift_left));
182 hZeroed->SetBinContent(i, 0);
184 hZeroed->SetBinContent(hZeroed->GetNbinsX(), hZeroed->GetBinContent(hZeroed->GetNbinsX()-1));
185 TGraph * gZeroed =
new TGraph(hZeroed);
186 gZeroed->SetBit(TGraph::kIsSortedX);
189 TH1D * hZeroedBroad = (TH1D*)hMassSq_Pion->Clone();
190 hZeroedBroad->Reset(
"M");
191 for (
int j = 1; j <= hZeroedBroad->GetNbinsX(); j++)
193 double bin_content = gZeroed->Eval(hZeroedBroad->GetBinCenter(j)/width, 0,
"S");
194 double bin_error = GetErrorN(bin_content)[0];
195 hZeroedBroad->SetBinContent(j, bin_content);
196 hZeroedBroad->SetBinError(j, bin_error);
201 TH1D * hBroadShifted = (TH1D*)hMassSq_Pion->Clone();
202 hBroadShifted->Reset(
"M");
204 const int iBinZero = hZeroedBroad->GetMaximumBin();
205 const int iParticlePeak = hZeroedBroad->GetXaxis()->FindBin(particle_mass);
206 int shift = iParticlePeak - iBinZero + 1;
207 if (fabs(particle_mass - massSqK) < 0.01) shift = shift - 1;
209 for (
int i = 1; i <= hBroadShifted->GetNbinsX(); i++)
211 if (hZeroedBroad->GetBinContent(i - shift) >= 0 && (i - shift) >= 0)
212 hBroadShifted->SetBinContent(i, hZeroedBroad->GetBinContent(i - shift));
214 hBroadShifted->SetBinContent(i, 0);
218 hBroadShifted->SetBinContent(hBroadShifted->GetNbinsX()+1, 0);
219 hBroadShifted->SetBinContent(0, 0);
220 return hBroadShifted;
230 vector<TH1D*> GetParticleFitsFromPionData(TH1D * hMassSq_ProtonKaonDeuteron, TH1D * hMassSq_Pion,
int ivol)
232 TH1D * hMassSq_PionShiftedToProton = GetParticleHistogramFromPionData(hMassSq_Pion, massSqP);
233 TGraph * GPionShiftedToProton =
new TGraph(hMassSq_PionShiftedToProton);
235 TH1D * hMassSq_PionShiftedToKaon = GetParticleHistogramFromPionData(hMassSq_Pion, massSqK);
236 TGraph * GPionShiftedToKaon =
new TGraph(hMassSq_PionShiftedToKaon);
238 TH1D * hMassSq_PionShiftedToDeuteron = GetParticleHistogramFromPionData(hMassSq_Pion, massSqD);
239 hMassSq_PionShiftedToDeuteron->Scale(0.9);
240 TGraph * GPionShiftedToDeuteron =
new TGraph(hMassSq_PionShiftedToDeuteron);
244 Print1DHist(hMassSq_Pion,
"plots_MassSq_shifted/",
"HighStatistics", 1,
true);
245 hMassSq_PionShiftedToProton->SetName(Form(
"Vol-%d_dEdx-massSq_PionShiftedToProton", ivol));
246 Print1DHist(hMassSq_PionShiftedToProton,
"plots_MassSq_shifted/",
"HighStatistics", 1,
true);
247 hMassSq_PionShiftedToKaon->SetName(Form(
"Vol-%d_dEdx-massSq_PionShiftedToKaon", ivol));
248 Print1DHist(hMassSq_PionShiftedToKaon,
"plots_MassSq_shifted/",
"HighStatistics", 1,
true);
249 hMassSq_PionShiftedToDeuteron->SetName(Form(
"Vol-%d_dEdx-massSq_PionShiftedToDeuteron", ivol));
250 Print1DHist(hMassSq_PionShiftedToDeuteron,
"plots_MassSq_shifted/",
"HighStatistics", 1,
true);
254 GPionShiftedToProton->SetBit(TGraph::kIsSortedX);
255 GPionShiftedToKaon->SetBit(TGraph::kIsSortedX);
256 GPionShiftedToDeuteron->SetBit(TGraph::kIsSortedX);
257 TF1 * FitT =
new TF1(
"FitT",[&](
double * x,
double * p){
return p[0]*GPionShiftedToProton->Eval(x[0], 0,
"S") + p[1]*GPionShiftedToKaon->Eval(x[0], 0,
"S") + p[2]*GPionShiftedToDeuteron->Eval(x[0], 0,
"S");}, -5, 5, 3);
260 hMassSq_ProtonKaonDeuteron->Fit(FitT,
"NQ",
"", -2.5, 5);
265 FitT->GetParameters(Param);
268 if (Param[2] > Param[0] || Param[2] < 0)
269 Param[2] = 0.00000001;
273 if (Param[0] >= 0 && Param[1] >= 0 && Param[2] >= 0)
275 cout<<
"Fit params: "<<Param[0]<<
", "<<Param[1]<<
", "<<Param[2]<<endl;
278 hMassSq_PionShiftedToProton->Scale(Param[0]);
279 TH1D * hhMassSq_TotalFit = (TH1D*)hMassSq_PionShiftedToProton->Clone();
280 hMassSq_PionShiftedToKaon->Scale(Param[1]);
281 hhMassSq_TotalFit->Add(hMassSq_PionShiftedToKaon);
282 hMassSq_PionShiftedToDeuteron->Scale(Param[2]);
283 hhMassSq_TotalFit->Add(hMassSq_PionShiftedToDeuteron);
295 hhMassSq_TotalFit->SetName(Form(
"Vol-%d_dEdx-massSq_FinalFit", ivol));
296 Print1DHist(hhMassSq_TotalFit,
"plots_MassSq_shifted/",
"HighStatistics", 1,
true);
297 vFits = {hhMassSq_TotalFit, hMassSq_PionShiftedToKaon, hMassSq_PionShiftedToProton, hMassSq_PionShiftedToDeuteron};
302 cout<<
"[WARNING]: Fit params: "<<Param[0]<<
", "<<Param[1]<<
", "<<Param[2]<<
". Fitting unsuccessful for Volume "<<ivol<<endl;
316 vector<TH1D*> GetParticleFitsFromBroadenedPionData(TH1D * hMassSq_ProtonKaonDeuteron,
320 double &d_norm_PercentErr,
321 double &chiSquaredperNDF)
323 TFile * fPionTemplateWidths =
new TFile(
"MassSquarePeakBroadening_Philip/PionTemplateWidths_backup.root");
324 if (pBinCenter > 11) pBinCenter = 11;
325 TGraphErrors * GParticlePeakWidth = (TGraphErrors*)fPionTemplateWidths->Get(Form(
"%2.1f-GeV_MSquaredResolutionNormalizedPion", pBinCenter));
326 GParticlePeakWidth->SetBit(TGraph::kIsSortedX);
327 double width_k = GParticlePeakWidth->Eval(massSqK, 0,
"S");
328 double width_p = GParticlePeakWidth->Eval(massSqP, 0,
"S");
329 double width_d = GParticlePeakWidth->Eval(massSqD, 0,
"S");
332 TH1D * hMassSq_PionShiftedToProton = GetBroadenedParticleHistogramFromPionData(hMassSq_Pion, massSqP, width_p);
333 TGraph * GPionShiftedToProton =
new TGraph(hMassSq_PionShiftedToProton);
335 TH1D * hMassSq_PionShiftedToKaon = GetBroadenedParticleHistogramFromPionData(hMassSq_Pion, massSqK, width_k);
336 TGraph * GPionShiftedToKaon =
new TGraph(hMassSq_PionShiftedToKaon);
338 TH1D * hMassSq_PionShiftedToDeuteron = GetBroadenedParticleHistogramFromPionData(hMassSq_Pion, massSqD, width_d);
339 hMassSq_PionShiftedToDeuteron->Scale(0.9);
340 TGraph * GPionShiftedToDeuteron =
new TGraph(hMassSq_PionShiftedToDeuteron);
344 Print1DHist(hMassSq_Pion,
"plots_MassSq_shifted_broad/",
"HighStatistics", 1,
true);
345 cout<<
"RMS of hMassSq_Pion: "<<hMassSq_Pion->GetRMS()<<endl;
346 hMassSq_PionShiftedToProton->SetName(Form(
"Vol-%d_dEdx-massSq_PionShiftedToProton", ivol));
347 Print1DHist(hMassSq_PionShiftedToProton,
"plots_MassSq_shifted_broad/",
"HighStatistics", 1,
true);
348 cout<<
"RMS of hMassSq_PionShiftedToProton: "<<hMassSq_PionShiftedToProton->GetRMS()<<endl;
349 hMassSq_PionShiftedToKaon->SetName(Form(
"Vol-%d_dEdx-massSq_PionShiftedToKaon", ivol));
350 Print1DHist(hMassSq_PionShiftedToKaon,
"plots_MassSq_shifted_broad/",
"HighStatistics", 1,
true);
351 cout<<
"RMS of hMassSq_PionShiftedToKaon: "<<hMassSq_PionShiftedToKaon->GetRMS()<<endl;
352 hMassSq_PionShiftedToDeuteron->SetName(Form(
"Vol-%d_dEdx-massSq_PionShiftedToDeuteron", ivol));
353 Print1DHist(hMassSq_PionShiftedToDeuteron,
"plots_MassSq_shifted_broad/",
"HighStatistics", 1,
true);
354 cout<<
"RMS of hMassSq_PionShiftedToDeuteron: "<<hMassSq_PionShiftedToDeuteron->GetRMS()<<endl;
358 GPionShiftedToProton->SetBit(TGraph::kIsSortedX);
359 GPionShiftedToKaon->SetBit(TGraph::kIsSortedX);
360 GPionShiftedToDeuteron->SetBit(TGraph::kIsSortedX);
361 TF1 * FitT =
new TF1(
"FitT",[&](
double * x,
double * p){
return p[0]*GPionShiftedToProton->Eval(x[0], 0,
"S") + p[1]*GPionShiftedToKaon->Eval(x[0], 0,
"S") + p[2]*GPionShiftedToDeuteron->Eval(x[0], 0,
"S");}, -5, 5, 3);
364 auto fit_result_ptr = hMassSq_ProtonKaonDeuteron->Fit(FitT,
"SNQ",
"", -2.5, 5);
368 cout<<
"\nChi-squared/NDF = "<<fit_result_ptr->Chi2()/fit_result_ptr->Ndf()<<endl<<endl;
373 FitT->GetParameters(Param);
376 ParEr[0] = FitT->GetParError(0);
377 ParEr[1] = FitT->GetParError(1);
378 ParEr[2] = FitT->GetParError(2);
381 if (Param[2] > Param[0] || Param[2] < 0)
382 Param[2] = 0.00000001;
386 if (Param[0] >= 0 && Param[1] >= 0 && Param[2] >= 0)
389 cout<<
"Fit params : "<<Param[0]<<
", "<<Param[1]<<
", "<<Param[2]<<endl;
390 cout<<
"Fit errors : "<<ParEr[0]<<
", "<<ParEr[1]<<
", "<<ParEr[2]<<endl;
391 cout<<
"Percent err : "<<100*ParEr[0]/Param[0]<<
", "<<100*ParEr[1]/Param[1]<<
", "<<100*ParEr[2]/Param[2]<<endl;
395 hMassSq_PionShiftedToProton->Scale(Param[0]);
396 TH1D * hhMassSq_TotalFit = (TH1D*)hMassSq_PionShiftedToProton->Clone();
397 hMassSq_PionShiftedToKaon->Scale(Param[1]);
398 hhMassSq_TotalFit->Add(hMassSq_PionShiftedToKaon);
399 hMassSq_PionShiftedToDeuteron->Scale(Param[2]);
400 hhMassSq_TotalFit->Add(hMassSq_PionShiftedToDeuteron);
412 hhMassSq_TotalFit->SetName(Form(
"Vol-%d_massSq_Fit_total", ivol));
413 Print1DHist(hhMassSq_TotalFit,
"plots_MassSq_shifted_broad/",
"HighStatistics", 1,
true);
415 hMassSq_PionShiftedToKaon->SetName(Form(
"Vol-%d_massSq_Fit_K", ivol));
416 hMassSq_PionShiftedToProton->SetName(Form(
"Vol-%d_massSq_Fit_P", ivol));
417 hMassSq_PionShiftedToDeuteron->SetName(Form(
"Vol-%d_massSq_Fit_D", ivol));
420 d_norm_PercentErr = 100*ParEr[2]/Param[2];
421 chiSquaredperNDF = fit_result_ptr->Chi2()/fit_result_ptr->Ndf();
422 vFits = {hhMassSq_TotalFit, hMassSq_PionShiftedToKaon, hMassSq_PionShiftedToProton, hMassSq_PionShiftedToDeuteron};
427 cout<<
"[WARNING]: Fit params: "<<Param[0]<<
", "<<Param[1]<<
", "<<Param[2]<<
". Fitting unsuccessful for Volume "<<ivol<<endl;
440 void RunFitDiagnostics(TH1D * hMassSq_FittedProton, TH1D * hMassSq_FittedKaon, TH1D * hMassSq_FittedDeuteron, TH1D * hMassSq_TotalFit,
int ivol)
451 TH1D * hMassSq_FitSum = (TH1D*)hMassSq_FittedProton->Clone();
452 hMassSq_FitSum->Add(hMassSq_FittedKaon);
453 hMassSq_FitSum->Add(hMassSq_FittedDeuteron);
454 TH1D * hRatio = GetRatioTH1D(hMassSq_TotalFit, hMassSq_FitSum);
455 hRatio->SetName(Form(
"Vol-%d_dEdx-massSq_RatioTotalFitOverSumFit", ivol));
456 hRatio->SetAxisRange(0, 2,
"Y");
457 for (
int i = 0; i <= hRatio->GetNbinsX(); i++)
459 hRatio->SetBinError(i, 0);
460 if (hRatio->GetBinCenter(i) < -4)
461 hRatio->SetBinContent(i, 1);
463 Print1DHist(hRatio,
"plots_1DMassSqFitsTFractionFitter/FitResiduals/",
"HighStatistics", 1,
true, 0);
472 vector<TH1D*> GetParticleFitsUsingTFractionFitter(TH1D * hMassSq_ProtonKaonDeuteron, TH1D * hMassSq_Pion,
int ivol)
474 const double massSqP = 0.8803544;
475 const double massSqK = 0.2437169;
476 const double massSqD = 3.6;
479 TH1D * hMassSq_PionShiftedToProton = GetParticleHistogramFromPionData(hMassSq_Pion, massSqP);
480 TH1D * hMassSq_PionShiftedToKaon = GetParticleHistogramFromPionData(hMassSq_Pion, massSqK);
481 TH1D * hMassSq_PionShiftedToDeuteron = GetParticleHistogramFromPionData(hMassSq_Pion, massSqD);
482 hMassSq_PionShiftedToDeuteron->Scale(0.1);
486 TObjArray * vHistMC =
new TObjArray(3);
487 vHistMC->Add(hMassSq_PionShiftedToProton);
488 vHistMC->Add(hMassSq_PionShiftedToKaon);
489 vHistMC->Add(hMassSq_PionShiftedToDeuteron);
490 TFractionFitter * fit =
new TFractionFitter(hMassSq_ProtonKaonDeuteron, vHistMC,
"Q");
491 fit->Constrain(0, 0.0, 1.0);
492 fit->Constrain(1, 0.0, 1.0);
493 fit->Constrain(2, 0.0, 1.0);
497 Int_t status = fit->Fit();
501 TH1D * hMassSq_TotalFit = (TH1D*) fit->GetPlot();
504 vector<double> Param;
507 fit->GetResult(0, param_values, param_errors); Param.push_back(param_values);
508 fit->GetResult(1, param_values, param_errors); Param.push_back(param_values);
509 fit->GetResult(2, param_values, param_errors); Param.push_back(param_values);
511 TH1D * hMassSq_FittedProton = (TH1D*)fit->GetMCPrediction(0);
512 TH1D * hMassSq_FittedKaon = (TH1D*)fit->GetMCPrediction(1);
513 TH1D * hMassSq_FittedDeuteron = (TH1D*)fit->GetMCPrediction(2);
516 hMassSq_FittedProton->Scale(1./hMassSq_FittedProton->Integral()*Param[0]*hMassSq_ProtonKaonDeuteron->Integral());
517 hMassSq_FittedKaon->Scale(1./hMassSq_FittedKaon->Integral()*Param[1]*hMassSq_ProtonKaonDeuteron->Integral());
518 hMassSq_FittedDeuteron->Scale(1./hMassSq_FittedDeuteron->Integral()*Param[2]*hMassSq_ProtonKaonDeuteron->Integral());
521 RunFitDiagnostics(hMassSq_FittedProton, hMassSq_FittedKaon, hMassSq_FittedDeuteron, hMassSq_TotalFit, ivol);
524 cout<<
"Fit params: "<<Param[0]<<
", "<<Param[1]<<
", "<<Param[2]<<endl;
525 vFits = {hMassSq_TotalFit, hMassSq_FittedKaon, hMassSq_FittedProton, hMassSq_FittedDeuteron};
530 cout<<
"[WARNING]: Fit status: "<<status<<
" for Volume "<<ivol<<endl;