764 std::shared_ptr<TTree> ttreeDstar,
765 std::shared_ptr<TTree> ttreeGamma, std::shared_ptr<TTree> ttreeGeneric)
767 gROOT->SetBatch(
true);
768 gStyle->SetOptStat(0);
772 TH1F* ProtonProfileBetaGamma = (TH1F*) HistListLambda->FindObject(
"ProtonProfileBetaGamma");
773 TH2F* Proton2DHistogram = (TH2F*) HistListLambda->FindObject(
"hist_d1_2212_truncMomentum");
777 TH1F* PionProfileBetaGamma = (TH1F*) HistListDstar->FindObject(
"PionProfileBetaGamma");
778 TH2F* Pion2DHistogram = (TH2F*) HistListDstar->FindObject(
"hist_d1_211_truncMomentum");
779 TH1F* KaonProfileBetaGamma = (TH1F*) HistListDstar->FindObject(
"KaonProfileBetaGamma");
780 TH2F* Kaon2DHistogram = (TH2F*) HistListDstar->FindObject(
"hist_d1_321_truncMomentum");
783 TH1F* ElectronProfileBetaGamma = (TH1F*) HistListGamma->FindObject(
"ElectronProfileBetaGamma");
784 TH2F* Electron2DHistogram = (TH2F*) HistListGamma->FindObject(
"hist_d1_11_truncMomentum");
786 int cred = TColor::GetColor(
"#e31a1c");
787 PionProfileBetaGamma->SetMarkerSize(4);
788 PionProfileBetaGamma->SetLineWidth(2);
789 PionProfileBetaGamma->SetMarkerColor(cred);
790 PionProfileBetaGamma->SetLineColor(cred);
792 int cpink = TColor::GetColor(
"#807dba");
793 KaonProfileBetaGamma->SetMarkerSize(4);
794 KaonProfileBetaGamma->SetLineWidth(2);
795 KaonProfileBetaGamma->SetMarkerColor(cpink);
796 KaonProfileBetaGamma->SetLineColor(cpink);
798 int cblue = TColor::GetColor(
"#084594");
799 ProtonProfileBetaGamma->SetMarkerSize(4);
800 ProtonProfileBetaGamma->SetLineWidth(2);
801 ProtonProfileBetaGamma->SetMarkerColor(cblue);
802 ProtonProfileBetaGamma->SetLineColor(cblue);
804 int cgreen = TColor::GetColor(
"#238b45");
805 ElectronProfileBetaGamma->SetMarkerSize(4);
806 ElectronProfileBetaGamma->SetLineWidth(2);
807 ElectronProfileBetaGamma->SetMarkerColor(cgreen);
808 ElectronProfileBetaGamma->SetLineColor(cgreen);
812 PionProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
813 KaonProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
814 ProtonProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
817 auto PionEdges = PionProfileBetaGamma->GetXaxis()->GetXbins()->GetArray();
818 auto ProtonEdges = ProtonProfileBetaGamma->GetXaxis()->GetXbins()->GetArray();
820 std::vector<float> CombinedEdgesVector;
822 double borderline = 3.;
824 for (
int i = 0; i < ProtonProfileBetaGamma->GetNbinsX() + 1; i++)
825 if (ProtonEdges[i] < borderline) CombinedEdgesVector.push_back(ProtonEdges[i]);
828 for (
int i = 0; i < PionProfileBetaGamma->GetNbinsX() + 1; i++)
829 if (PionEdges[i] > borderline) CombinedEdgesVector.push_back(PionEdges[i]);
832 TH1F* CombinedHistogramPAndPi =
new TH1F(
"CombinedHistogramPAndPi",
"histo_for_fit", CombinedEdgesVector.size() - 1,
833 CombinedEdgesVector.data());
836 for (
int i = 1; i < ProtonProfileBetaGamma->GetNbinsX() + 1; i++)
837 if (ProtonEdges[i - 1] < borderline) {
838 CombinedHistogramPAndPi->SetBinContent(i, ProtonProfileBetaGamma->GetBinContent(i));
839 CombinedHistogramPAndPi->SetBinError(i, ProtonProfileBetaGamma->GetBinError(i));
843 for (
int i = 1; i < PionProfileBetaGamma->GetNbinsX() + 1; i++)
844 if (PionEdges[i - 1] > borderline) {
846 CombinedHistogramPAndPi->SetBinContent(iterator, PionProfileBetaGamma->GetBinContent(i));
847 CombinedHistogramPAndPi->SetBinError(iterator, PionProfileBetaGamma->GetBinError(i));
852 TF1* BetaGammaFunctionPion =
new TF1(
"BetaGammaFunctionPion",
"[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4] + [6]* (x/[2])**0.5",
855 BetaGammaFunctionPion->SetNpx(1000);
857 BetaGammaFunctionPion->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
859 BetaGammaFunctionPion->SetParLimits(0, 3.e5, 7.e5);
860 BetaGammaFunctionPion->SetParLimits(1, -3.e4, 1.e4);
861 BetaGammaFunctionPion->SetParLimits(3, 0.1, 0.2);
862 BetaGammaFunctionPion->SetParLimits(4, 0.9, 1.6);
863 BetaGammaFunctionPion->SetParLimits(5, 3.e5, 7.e5);
864 BetaGammaFunctionPion->SetParLimits(6, 0., 1.e6);
865 BetaGammaFunctionPion->FixParameter(2, 1);
869 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Minuit2",
"Migrad");
870 auto FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0SI",
"", 0.4, 25);
872 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
873 BetaGammaFunctionPion->FixParameter(3, 0.15);
874 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0SI",
"", 0.4, 25);
876 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
877 BetaGammaFunctionPion->FixParameter(3, 0.15);
878 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0SI",
"", 0.45, 25);
880 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
881 BetaGammaFunctionPion->FixParameter(3, 0.15);
882 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0S",
"", 0.5, 25);
885 B2INFO(
"BetaGamma fit for pions done. Fit status: " << FitResultBetaGammaPion->Status());
887 B2INFO(
"Fit parameters:");
888 B2INFO(
"p0: " << BetaGammaFunctionPion->GetParameter(0) <<
" +- " << BetaGammaFunctionPion->GetParError(0));
889 B2INFO(
"p1: " << BetaGammaFunctionPion->GetParameter(1) <<
" +- " << BetaGammaFunctionPion->GetParError(1));
890 B2INFO(
"p2: " << BetaGammaFunctionPion->GetParameter(2) <<
" +- " << BetaGammaFunctionPion->GetParError(2));
891 B2INFO(
"p3: " << BetaGammaFunctionPion->GetParameter(3) <<
" +- " << BetaGammaFunctionPion->GetParError(3));
892 B2INFO(
"p4: " << BetaGammaFunctionPion->GetParameter(4) <<
" +- " << BetaGammaFunctionPion->GetParError(4));
893 B2INFO(
"p5: " << BetaGammaFunctionPion->GetParameter(5) <<
" +- " << BetaGammaFunctionPion->GetParError(5));
894 B2INFO(
"p6: " << BetaGammaFunctionPion->GetParameter(6) <<
" +- " << BetaGammaFunctionPion->GetParError(6));
897 TF1* BetaGammaFunctionKaon =
new TF1(
"BetaGammaFunctionKaon",
"[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4]+ [6]* (x/[2])**0.5",
900 BetaGammaFunctionKaon->SetNpx(1000);
901 BetaGammaFunctionKaon->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
903 BetaGammaFunctionKaon->SetParLimits(0, 3.e5, 7.e5);
904 BetaGammaFunctionKaon->SetParLimits(1, -3.e4, 1.e4);
905 BetaGammaFunctionKaon->SetParLimits(3, 0.1, 0.2);
906 BetaGammaFunctionKaon->SetParLimits(4, 0.9, 1.6);
907 BetaGammaFunctionKaon->SetParLimits(5, 3.e5, 7.e5);
908 BetaGammaFunctionKaon->SetParLimits(6, 0., 1.e6);
910 BetaGammaFunctionKaon->FixParameter(2, 1);
913 BetaGammaFunctionKaon->SetLineColor(KaonProfileBetaGamma->GetMarkerColor());
915 auto FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0SI",
"", 0.4, 8.5);
917 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
918 BetaGammaFunctionKaon->FixParameter(3, 0.15);
919 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0SI",
"", 0.4, 8.5);
921 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
922 BetaGammaFunctionKaon->FixParameter(3, 0.15);
923 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0SI",
"", 0.45, 8);
925 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
926 BetaGammaFunctionKaon->FixParameter(3, 0.15);
927 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0S",
"", 0.5, 8);
930 B2INFO(
"BetaGamma fit for kaons done. Fit status: " << FitResultBetaGammaKaon->Status());
931 B2INFO(
"Fit parameters:");
932 B2INFO(
"p0: " << BetaGammaFunctionKaon->GetParameter(0) <<
" +- " << BetaGammaFunctionKaon->GetParError(0));
933 B2INFO(
"p1: " << BetaGammaFunctionKaon->GetParameter(1) <<
" +- " << BetaGammaFunctionKaon->GetParError(1));
934 B2INFO(
"p2: " << BetaGammaFunctionKaon->GetParameter(2) <<
" +- " << BetaGammaFunctionKaon->GetParError(2));
935 B2INFO(
"p3: " << BetaGammaFunctionKaon->GetParameter(3) <<
" +- " << BetaGammaFunctionKaon->GetParError(3));
936 B2INFO(
"p4: " << BetaGammaFunctionKaon->GetParameter(4) <<
" +- " << BetaGammaFunctionKaon->GetParError(4));
937 B2INFO(
"p5: " << BetaGammaFunctionKaon->GetParameter(5) <<
" +- " << BetaGammaFunctionKaon->GetParError(5));
938 B2INFO(
"p6: " << BetaGammaFunctionKaon->GetParameter(6) <<
" +- " << BetaGammaFunctionKaon->GetParError(6));
941 TF1* BetaGammaFunctionProton =
new TF1(
"BetaGammaFunctionProton",
942 "[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4]+ [6]* (x/[2])**0.5", 0.01, 25.);
944 BetaGammaFunctionProton->SetNpx(1000);
946 BetaGammaFunctionProton->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
948 BetaGammaFunctionProton->SetParLimits(0, 3.e5, 7.e5);
949 BetaGammaFunctionProton->SetParLimits(1, -3.e4, 1.e4);
950 BetaGammaFunctionProton->SetParLimits(3, 0.1, 0.2);
951 BetaGammaFunctionProton->SetParLimits(4, 0.9, 1.6);
952 BetaGammaFunctionProton->SetParLimits(5, 3.e5, 7.e5);
953 BetaGammaFunctionProton->SetParLimits(6, 0., 1.e6);
955 BetaGammaFunctionProton->FixParameter(2, 1);
958 BetaGammaFunctionProton->SetLineColor(ProtonProfileBetaGamma->GetMarkerColor());
960 auto FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 15);
962 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
963 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
964 BetaGammaFunctionProton->FixParameter(3, 0.15);
965 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 15);
967 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
968 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
969 BetaGammaFunctionProton->FixParameter(3, 0.15);
970 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 10);
972 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
973 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
974 BetaGammaFunctionProton->FixParameter(3, 0.15);
975 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0S",
"", 0.5, 10);
978 B2INFO(
"BetaGamma fit for protons done. Fit status: " << FitResultBetaGammaProton->Status());
979 B2INFO(
"Fit parameters:");
980 B2INFO(
"p0: " << BetaGammaFunctionProton->GetParameter(0) <<
" +- " << BetaGammaFunctionProton->GetParError(0));
981 B2INFO(
"p1: " << BetaGammaFunctionProton->GetParameter(1) <<
" +- " << BetaGammaFunctionProton->GetParError(1));
982 B2INFO(
"p2: " << BetaGammaFunctionProton->GetParameter(2) <<
" +- " << BetaGammaFunctionProton->GetParError(2));
983 B2INFO(
"p3: " << BetaGammaFunctionProton->GetParameter(3) <<
" +- " << BetaGammaFunctionProton->GetParError(3));
984 B2INFO(
"p4: " << BetaGammaFunctionProton->GetParameter(4) <<
" +- " << BetaGammaFunctionProton->GetParError(4));
985 B2INFO(
"p5: " << BetaGammaFunctionProton->GetParameter(5) <<
" +- " << BetaGammaFunctionProton->GetParError(5));
986 B2INFO(
"p6: " << BetaGammaFunctionProton->GetParameter(6) <<
" +- " << BetaGammaFunctionProton->GetParError(6));
990 std::unique_ptr<TCanvas> CombinedCanvasHadrons(
new TCanvas(
"CombinedCanvasHadrons",
"Hadron beta*gamma fits", 10, 10, 1000, 700));
991 gStyle->SetOptFit(1111);
993 PionProfileBetaGamma->Draw();
994 PionProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionPion);
995 KaonProfileBetaGamma->Draw(
"SAME");
996 KaonProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionKaon);
997 ProtonProfileBetaGamma->Draw(
"SAME");
998 ProtonProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionProton);
1002 auto legend =
new TLegend(0.4, 0.7, 0.65, 0.9);
1003 legend->AddEntry(PionProfileBetaGamma,
"Pions",
"lep");
1004 legend->AddEntry(KaonProfileBetaGamma,
"Kaons",
"lep");
1005 legend->AddEntry(ProtonProfileBetaGamma,
"Protons",
"lep");
1011 CombinedCanvasHadrons->Print(
"HadronBetaGammaFits.pdf");
1012 TFile HadronFitPlotFile(
"SVDdEdxCalibrationHadronFitPlotFile.root",
"RECREATE");
1013 PionProfileBetaGamma->Write();
1014 KaonProfileBetaGamma->Write();
1015 ProtonProfileBetaGamma->Write();
1016 CombinedHistogramPAndPi->Write();
1017 BetaGammaFunctionPion->Write();
1018 BetaGammaFunctionKaon->Write();
1019 BetaGammaFunctionProton->Write();
1020 CombinedCanvasHadrons->Write();
1021 HadronFitPlotFile.Close();
1027 BetaGammaFunctionKaon = (TF1*) BetaGammaFunctionPion->Clone(
"BetaGammaFunctionKaon");
1028 BetaGammaFunctionProton = (TF1*) BetaGammaFunctionPion->Clone(
"BetaGammaFunctionProton");
1031 BetaGammaFunctionKaon = (TF1*) BetaGammaFunctionProton->Clone(
"BetaGammaFunctionKaon");
1032 BetaGammaFunctionPion = (TF1*) BetaGammaFunctionProton->Clone(
"BetaGammaFunctionPion");
1036 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
1037 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
1038 if (FitResultBetaGammaPion->Status() == 0) {
1039 BetaGammaFunctionProton = (TF1*) BetaGammaFunctionPion->Clone(
"BetaGammaFunctionProton");
1040 }
else if (FitResultBetaGammaKaon->Status() == 0) {
1041 BetaGammaFunctionProton = (TF1*) BetaGammaFunctionKaon->Clone(
"BetaGammaFunctionProton");
1043 B2WARNING(
"Problem with the beta*gamma fit for protons, reverting to the default values");
1044 BetaGammaFunctionProton->SetParameters(450258, -10900.8, 1, 0.126797, 1.155, 641907, 86304.5);
1048 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
1049 if (FitResultBetaGammaProton->Status() == 0) {
1050 BetaGammaFunctionKaon = (TF1*) BetaGammaFunctionProton->Clone(
"BetaGammaFunctionKaon");
1051 }
else if (FitResultBetaGammaPion->Status() == 0) {
1052 BetaGammaFunctionKaon = (TF1*) BetaGammaFunctionPion->Clone(
"BetaGammaFunctionKaon");
1054 B2WARNING(
"Problem with the beta*gamma fit for kaons, reverting to the default values");
1055 BetaGammaFunctionKaon->SetParameters(543386, 3013.81, 1, 0.135517, 1.19742, 619509, 15484.4);
1059 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
1060 if (FitResultBetaGammaKaon->Status() == 0) {
1061 BetaGammaFunctionPion = (TF1*) BetaGammaFunctionKaon->Clone(
"BetaGammaFunctionPion");
1062 }
else if (FitResultBetaGammaProton->Status() == 0) {
1063 BetaGammaFunctionPion = (TF1*) BetaGammaFunctionProton->Clone(
"BetaGammaFunctionPion");
1065 B2WARNING(
"Problem with the beta*gamma fit for pions, reverting to the default values");
1066 BetaGammaFunctionPion->SetParameters(537623, -1937.62, 1, 0.15292, 1.23803, 623678, 30400.9);
1073 TF1* BetaGammaFunctionElectron =
new TF1(
"BetaGammaFunctionElectron",
"[0] + [1]* x", 1, 10000.);
1074 BetaGammaFunctionElectron->SetParameters(6.e5, -1);
1075 BetaGammaFunctionElectron->SetParLimits(0, 3.e5, 8.e5);
1076 BetaGammaFunctionElectron->SetParLimits(1, -1.e5, 1.e5);
1077 auto FitResultBetaGammaElectron = ElectronProfileBetaGamma->Fit(
"BetaGammaFunctionElectron",
"0SI",
"", 100, 8000);
1080 if ((FitResultBetaGammaElectron->Status() > 1) || (BetaGammaFunctionElectron->Eval(1) < 3.e5)
1081 || (BetaGammaFunctionElectron->Eval(1) > 5.e6)) {
1082 FitResultBetaGammaElectron = ElectronProfileBetaGamma->Fit(
"BetaGammaFunctionElectron",
"0S",
"", 100, 10000);
1084 B2INFO(
"BetaGamma fit for electrons done. Fit status: " << FitResultBetaGammaElectron->Status());
1085 B2INFO(
"Fit parameters:");
1086 B2INFO(
"p0: " << BetaGammaFunctionElectron->GetParameter(0) <<
" +- " << BetaGammaFunctionElectron->GetParError(0));
1087 B2INFO(
"p1: " << BetaGammaFunctionElectron->GetParameter(1) <<
" +- " << BetaGammaFunctionElectron->GetParError(1));
1090 ElectronProfileBetaGamma->SetMarkerSize(4);
1091 ElectronProfileBetaGamma->SetLineWidth(2);
1092 ElectronProfileBetaGamma->GetYaxis()->SetRangeUser(5e5, 1e6);
1093 ElectronProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionElectron);
1096 std::unique_ptr<TCanvas> ElectronCanvas(
new TCanvas(
"ElectronCanvas",
"Electron histogram", 10, 10, 1000, 700));
1097 ElectronProfileBetaGamma->Draw();
1101 ElectronCanvas->Print(
"ElectronBetaGammaFits.pdf");
1102 TFile ElectronFitPlotFile(
"SVDdEdxCalibrationElectronFitPlotFile.root",
"RECREATE");
1103 ElectronProfileBetaGamma->Write();
1104 BetaGammaFunctionElectron->Write();
1105 ElectronCanvas->Write();
1106 ElectronFitPlotFile.Close();
1109 TF1* MomentumFunctionElectron = (TF1*) BetaGammaFunctionElectron->Clone(
"MomentumFunctionElectron");
1111 MomentumFunctionElectron->SetRange(0.01, 5.5);
1112 MomentumFunctionElectron->SetLineColor(kRed);
1113 MomentumFunctionElectron->SetLineWidth(4);
1115 TF1* MomentumFunctionPion = (TF1*) BetaGammaFunctionPion->Clone(
"MomentumFunctionPion");
1117 MomentumFunctionPion->SetRange(0.01, 5.5);
1118 MomentumFunctionPion->SetLineColor(kRed);
1119 MomentumFunctionPion->SetLineWidth(4);
1121 TF1* MomentumFunctionProton = (TF1*) BetaGammaFunctionProton->Clone(
"MomentumFunctionProton");
1123 MomentumFunctionProton->SetRange(0.01, 5.5);
1124 MomentumFunctionProton->SetLineColor(kRed);
1125 MomentumFunctionProton->SetLineWidth(4);
1127 TF1* MomentumFunctionKaon = (TF1*) BetaGammaFunctionKaon->Clone(
"MomentumFunctionKaon");
1129 MomentumFunctionKaon->SetRange(0.01, 5.5);
1130 MomentumFunctionKaon->SetLineColor(kRed);
1131 MomentumFunctionKaon->SetLineWidth(4);
1133 gStyle->SetOptFit(1111);
1134 std::unique_ptr<TCanvas> CanvasOverlays(
new TCanvas(
"CanvasOverlays",
"overlays", 1300, 1000));
1135 CanvasOverlays->Divide(2, 2);
1136 CanvasOverlays->cd(1); Electron2DHistogram->Draw(); MomentumFunctionElectron->Draw(
"SAME");
1137 CanvasOverlays->cd(2); Pion2DHistogram->Draw(); MomentumFunctionPion->Draw(
"SAME");
1138 CanvasOverlays->cd(3); Kaon2DHistogram->Draw(); MomentumFunctionKaon->Draw(
"SAME");
1139 CanvasOverlays->cd(4); Proton2DHistogram->Draw(); MomentumFunctionProton->Draw(
"SAME");
1140 CanvasOverlays->Print(
"SVDdEdxOverlaysFitsHistos.pdf");
1142 TF1* MomentumFunctionDeuteron = (TF1*) BetaGammaFunctionProton->Clone(
"MomentumFunctionDeuteron");
1144 MomentumFunctionDeuteron->SetRange(0.01, 5.5);
1145 MomentumFunctionDeuteron->SetLineColor(kRed);
1147 TF1* MomentumFunctionMuon = (TF1*) BetaGammaFunctionPion->Clone(
"MomentumFunctionMuon");
1149 MomentumFunctionMuon->SetRange(0.01, 5.5);
1150 MomentumFunctionMuon->SetLineColor(kRed);
1154 std::unique_ptr<TCanvas> OverlayAllTracksCanvas(
new TCanvas(
"OverlayAllTracksCanvas",
"The Ultimate Plot", 10, 10, 1000, 700));
1156 TH2F* AllTracksHistogram =
new TH2F(
"AllTracksHistogram",
"AllTracksHistogram;Momentum [GeV/c];dEdx [arb. units]", 1000, 0.05, 5,
1159 ttreeGeneric->Draw(
"TrackSVDdEdx:TrackSVDdEdxTrackMomentum>>AllTracksHistogram",
"TracknSVDHits>7",
"goff");
1160 AllTracksHistogram->Draw(
"COLZ");
1161 AllTracksHistogram->GetXaxis()->SetTitle(
"Momentum [GeV/c]");
1162 AllTracksHistogram->GetYaxis()->SetTitle(
"dE/dx [arbitrary units]");
1163 MomentumFunctionElectron->Draw(
"SAME");
1164 MomentumFunctionMuon->Draw(
"SAME");
1165 MomentumFunctionPion->Draw(
"SAME");
1166 MomentumFunctionKaon->Draw(
"SAME");
1167 MomentumFunctionProton->Draw(
"SAME");
1168 MomentumFunctionDeuteron->Draw(
"SAME");
1169 OverlayAllTracksCanvas->SetLogx();
1170 OverlayAllTracksCanvas->SetLogz();
1172 OverlayAllTracksCanvas->Print(
"SVDdEdxAllTracksWithFits.pdf");
1173 TFile OverlayAllTracksPlotFile(
"SVDdEdxCalibrationOverlayAllTracks.root",
"RECREATE");
1174 AllTracksHistogram->Write();
1175 MomentumFunctionElectron->Write();
1176 MomentumFunctionMuon->Write();
1177 MomentumFunctionPion->Write();
1178 MomentumFunctionKaon->Write();
1179 MomentumFunctionProton->Write();
1180 MomentumFunctionDeuteron->Write();
1181 OverlayAllTracksCanvas->Write();
1182 OverlayAllTracksPlotFile.Close();
1188 double PionRangeMin = 0.6;
1189 double PionRangeMax = 1.;
1190 double KaonRangeMin = 1.9;
1191 double KaonRangeMax = 3;
1192 double ElectronRangeMin = 1.;
1193 double ElectronRangeMax = 1.4;
1195 auto PionResolutionHistogram = Pion2DHistogram->ProjectionY(
"PionResolutionHistogram",
1196 Pion2DHistogram->GetXaxis()->FindBin(PionRangeMin),
1197 Pion2DHistogram->GetXaxis()->FindBin(PionRangeMax));
1198 auto ElectronResolutionHistogram = Electron2DHistogram->ProjectionY(
"ElectronResolutionHistogram",
1199 Electron2DHistogram->GetXaxis()->FindBin(ElectronRangeMin), Electron2DHistogram->GetXaxis()->FindBin(ElectronRangeMax));
1200 auto KaonResolutionHistogram = Kaon2DHistogram->ProjectionY(
"KaonResolutionHistogram",
1201 Kaon2DHistogram->GetXaxis()->FindBin(KaonRangeMin),
1202 Kaon2DHistogram->GetXaxis()->FindBin(KaonRangeMax));
1206 TF1* PionResolutionFunction =
new TF1(
"PionResolutionFunction",
1207 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 100e3, 1500e3);
1212 PionResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1213 PionResolutionFunction->SetParLimits(0, 0, 500);
1214 PionResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1215 PionResolutionFunction->SetParLimits(2, 0, 1);
1216 PionResolutionFunction->SetParLimits(3, 0, 500);
1217 PionResolutionFunction->SetParLimits(4, 0, 7);
1218 PionResolutionFunction->SetParLimits(5, 1, 7);
1219 PionResolutionFunction->SetNpx(1000);
1220 auto FitResultResolutionPion = PionResolutionHistogram->Fit(PionResolutionFunction,
"RSI");
1222 B2INFO(
"relative resolution for pions: " << PionResolutionFunction->GetParameter(2));
1223 B2INFO(
"resolution for pions: fit status" << FitResultResolutionPion->Status());
1225 TF1* KaonResolutionFunction =
new TF1(
"KaonResolutionFunction",
1226 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 100e3, 1500e3);
1229 KaonResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1230 KaonResolutionFunction->SetParLimits(0, 0, 500);
1231 KaonResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1232 KaonResolutionFunction->SetParLimits(2, 0, 1);
1233 KaonResolutionFunction->SetParLimits(3, 0, 500);
1234 KaonResolutionFunction->SetParLimits(4, 0, 7);
1235 KaonResolutionFunction->SetParLimits(5, 1, 7);
1236 KaonResolutionFunction->SetNpx(1000);
1237 auto FitResultResolutionKaon = KaonResolutionHistogram->Fit(KaonResolutionFunction,
"RSI");
1239 B2INFO(
"relative resolution for kaons: " << KaonResolutionFunction->GetParameter(2));
1240 B2INFO(
"resolution for kaons: fit status" << FitResultResolutionKaon->Status());
1242 if ((FitResultResolutionKaon->Status() > 1)
1243 && (FitResultResolutionPion->Status() <= 1)) KaonResolutionFunction = (TF1*)
1244 PionResolutionFunction->Clone(
"KaonResolutionFunction");
1249 TF1* ElectronResolutionFunction =
new TF1(
"ElectronResolutionFunction",
1250 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 50e3, 1500e3);
1253 ElectronResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1254 ElectronResolutionFunction->SetParLimits(0, 0, 500);
1255 ElectronResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1256 ElectronResolutionFunction->SetParLimits(2, 0, 1);
1257 ElectronResolutionFunction->SetParLimits(3, 0, 500);
1258 ElectronResolutionFunction->SetParLimits(4, 0, 7);
1259 ElectronResolutionFunction->SetParLimits(5, 1, 7);
1260 ElectronResolutionFunction->SetNpx(1000);
1261 auto FitResultResolutionElectron = ElectronResolutionHistogram->Fit(ElectronResolutionFunction,
"RSI");
1263 B2INFO(
"relative resolution for electrons: " << ElectronResolutionFunction->GetParameter(2));
1264 B2INFO(
"resolution for electrons: fit status" << FitResultResolutionElectron->Status());
1268 TCanvas* CanvasResolutions =
new TCanvas(
"CanvasResolutions",
"Resolutions", 1200, 650);
1269 CanvasResolutions->Divide(3, 1);
1270 CanvasResolutions->cd(1); PionResolutionHistogram->Draw();
1271 CanvasResolutions->cd(2); KaonResolutionHistogram->Draw();
1272 CanvasResolutions->cd(3); ElectronResolutionHistogram->Draw();
1274 CanvasResolutions->Print(
"SVDdEdxResolutions.pdf");
1275 TFile OverlayResolutionsPlotFile(
"SVDdEdxCalibrationResolutions.root",
"RECREATE");
1276 PionResolutionHistogram->Write();
1277 KaonResolutionHistogram->Write();
1278 ElectronResolutionHistogram->Write();
1279 CanvasResolutions->Write();
1280 OverlayResolutionsPlotFile.Close();
1286 double BiasCorrectionPion = PionResolutionFunction->GetParameter(1) - MomentumFunctionPion->Eval((
1287 PionRangeMax + PionRangeMin) / 2.);
1288 B2INFO(
"BiasCorrectionPion = " << BiasCorrectionPion);
1291 TH2F* Pion2DHistogramNew =
PrepareNewHistogram(Pion2DHistogram, Form(
"%sNew", Pion2DHistogram->GetName()), MomentumFunctionPion,
1292 PionResolutionFunction, BiasCorrectionPion);
1295 TH2F* Pion2DHistogramResidual = (TH2F*) Pion2DHistogram->Clone(
"Pion2DHistogramResidual");
1296 Pion2DHistogramResidual->Add(Pion2DHistogramNew, Pion2DHistogram, 1, -1);
1297 Pion2DHistogramResidual->SetMinimum(-0.15);
1298 Pion2DHistogramResidual->SetMaximum(0.15);
1301 double BiasCorrectionKaon = KaonResolutionFunction->GetParameter(1) - MomentumFunctionKaon->Eval((
1302 KaonRangeMax + KaonRangeMin) / 2.);
1303 B2INFO(
"BiasCorrectionKaon = " << BiasCorrectionKaon);
1307 double BiasCorrectionProton = KaonResolutionFunction->GetParameter(1) - MomentumFunctionProton->Eval(3.);
1308 B2INFO(
"BiasCorrectionProton = " << BiasCorrectionProton);
1310 if ((BiasCorrectionProton / BiasCorrectionKaon) > 1.5) BiasCorrectionProton =
1314 TH2F* Kaon2DHistogramNew =
PrepareNewHistogram(Kaon2DHistogram, Form(
"%sNew", Kaon2DHistogram->GetName()), MomentumFunctionKaon,
1315 KaonResolutionFunction, BiasCorrectionKaon);
1317 TH2F* Kaon2DHistogramResidual = (TH2F*) Kaon2DHistogram->Clone(
"Kaon2DHistogramResidual");
1318 Kaon2DHistogramResidual->Add(Kaon2DHistogramNew, Kaon2DHistogram, 1, -1);
1319 Kaon2DHistogramResidual->SetMinimum(-0.15);
1320 Kaon2DHistogramResidual->SetMaximum(0.15);
1323 TH2F* Proton2DHistogramNew =
PrepareNewHistogram(Proton2DHistogram, Form(
"%sNew", Proton2DHistogram->GetName()),
1324 MomentumFunctionProton,
1325 KaonResolutionFunction, BiasCorrectionProton);
1328 TH2F* Proton2DHistogramResidual = (TH2F*) Proton2DHistogram->Clone(
"Proton2DHistogramResidual");
1329 Proton2DHistogramResidual->Add(Proton2DHistogramNew, Proton2DHistogram, 1, -1);
1330 Proton2DHistogramResidual->SetMinimum(-0.15);
1331 Proton2DHistogramResidual->SetMaximum(0.15);
1334 TH2F* Deuteron2DHistogramNew =
PrepareNewHistogram(Proton2DHistogram,
"Deuteron2DHistogramNew", MomentumFunctionDeuteron,
1335 KaonResolutionFunction,
1336 BiasCorrectionKaon);
1337 Deuteron2DHistogramNew->SetTitle(
"hist_d1_1000010020_trunc");
1340 TH2F* Muon2DHistogramNew =
PrepareNewHistogram(Pion2DHistogram,
"Muon2DHistogramNew", MomentumFunctionMuon, PionResolutionFunction,
1341 BiasCorrectionPion);
1342 Muon2DHistogramNew->SetTitle(
"hist_d1_13_trunc");
1345 double BiasCorrectionElectron = ElectronResolutionFunction->GetParameter(1) - MomentumFunctionElectron->Eval((
1346 ElectronRangeMax + ElectronRangeMin) / 2.);
1347 B2INFO(
"BiasCorrectionElectron = " << BiasCorrectionElectron);
1348 TH2F* Electron2DHistogramNew =
PrepareNewHistogram(Electron2DHistogram, Form(
"%sNew", Electron2DHistogram->GetName()),
1349 MomentumFunctionElectron,
1350 ElectronResolutionFunction, BiasCorrectionElectron);
1352 TH2F* Electron2DHistogramResidual = (TH2F*) Electron2DHistogram->Clone(
"Electron2DHistogramResidual");
1353 Electron2DHistogramResidual->Add(Electron2DHistogramNew, Electron2DHistogram, 1, -1);
1354 Electron2DHistogramResidual->SetMinimum(-0.15);
1355 Electron2DHistogramResidual->SetMaximum(0.15);
1357 Electron2DHistogramNew->SetName(
"Electron2DHistogramNew");
1358 Muon2DHistogramNew->SetName(
"Muon2DHistogramNew");
1359 Pion2DHistogramNew->SetName(
"Pion2DHistogramNew");
1360 Kaon2DHistogramNew->SetName(
"Kaon2DHistogramNew");
1361 Proton2DHistogramNew->SetName(
"Proton2DHistogramNew");
1362 Deuteron2DHistogramNew->SetName(
"Deuteron2DHistogramNew");
1366 TCanvas* CanvasSummaryGenerated =
new TCanvas(
"CanvasSummaryGenerated",
"Generated payloads", 1700, 850);
1367 CanvasSummaryGenerated->Divide(3, 2);
1368 CanvasSummaryGenerated->cd(1); Electron2DHistogramNew->Draw(
"COLZ");
1369 CanvasSummaryGenerated->cd(2); Muon2DHistogramNew->Draw(
"COLZ");
1370 CanvasSummaryGenerated->cd(3); Pion2DHistogramNew->Draw(
"COLZ");
1371 CanvasSummaryGenerated->cd(4); Kaon2DHistogramNew->Draw(
"COLZ");
1372 CanvasSummaryGenerated->cd(5); Proton2DHistogramNew->Draw(
"COLZ");
1373 CanvasSummaryGenerated->cd(6); Deuteron2DHistogramNew->Draw(
"COLZ");
1375 CanvasSummaryGenerated->Print(
"SVDdEdxGeneratedPayloads.pdf");
1376 TFile SummaryGeneratedPlotFile(
"SVDdEdxCalibrationSummaryGenerated.root",
"RECREATE");
1377 Electron2DHistogramNew->Write();
1378 Muon2DHistogramNew->Write();
1379 Pion2DHistogramNew->Write();
1380 Kaon2DHistogramNew->Write();
1381 Proton2DHistogramNew->Write();
1382 Deuteron2DHistogramNew->Write();
1383 SummaryGeneratedPlotFile.Close();
1386 TCanvas* CanvasSummaryData =
new TCanvas(
"CanvasSummaryData",
"Data distributions", 1700, 850);
1387 CanvasSummaryData->Divide(3, 2);
1388 CanvasSummaryData->cd(1); Electron2DHistogram->Draw(
"COLZ");
1389 CanvasSummaryData->cd(3); Pion2DHistogram->Draw(
"COLZ");
1390 CanvasSummaryData->cd(4); Kaon2DHistogram->Draw(
"COLZ");
1391 CanvasSummaryData->cd(5); Proton2DHistogram->Draw(
"COLZ");
1393 CanvasSummaryData->Print(
"SVDdEdxDataDistributions.pdf");
1394 TFile SummaryDataPlotFile(
"SVDdEdxCalibrationSummaryData.root",
"RECREATE");
1395 Electron2DHistogram->Write();
1396 Pion2DHistogram->Write();
1397 Kaon2DHistogram->Write();
1398 Proton2DHistogram->Write();
1399 SummaryDataPlotFile.Close();
1402 TCanvas* CanvasSummaryResiduals =
new TCanvas(
"CanvasSummaryResiduals",
"Residuals", 1700, 850);
1403 CanvasSummaryResiduals->Divide(3, 2);
1404 CanvasSummaryResiduals->cd(1); Electron2DHistogramResidual->Draw(
"COLZ");
1405 CanvasSummaryResiduals->cd(3); Pion2DHistogramResidual->Draw(
"COLZ");
1406 CanvasSummaryResiduals->cd(4); Kaon2DHistogramResidual->Draw(
"COLZ");
1407 CanvasSummaryResiduals->cd(5); Proton2DHistogramResidual->Draw(
"COLZ");
1410 CanvasSummaryResiduals->Print(
"SVDdEdxResiduals.pdf");
1411 TFile SummaryResidualsPlotFile(
"SVDdEdxCalibrationSummaryResiduals.root",
"RECREATE");
1412 Electron2DHistogramResidual->Write();
1413 Pion2DHistogramResidual->Write();
1414 Kaon2DHistogramResidual->Write();
1415 Proton2DHistogramResidual->Write();
1416 SummaryResidualsPlotFile.Close();
1421 std::unique_ptr<TList> histList(
new TList);
1422 histList->Add(Electron2DHistogramNew);
1423 histList->Add(Muon2DHistogramNew);
1424 histList->Add(Pion2DHistogramNew);
1425 histList->Add(Kaon2DHistogramNew);
1426 histList->Add(Proton2DHistogramNew);
1427 histList->Add(Deuteron2DHistogramNew);