758 std::shared_ptr<TTree> ttreeDstar,
759 std::shared_ptr<TTree> ttreeGamma, std::shared_ptr<TTree> ttreeGeneric)
761 gROOT->SetBatch(
true);
762 gStyle->SetOptStat(0);
766 TH1D* ProtonProfileBetaGamma =
static_cast<TH1D*
>(HistListLambda->FindObject(
"ProtonProfileBetaGamma"));
767 TH2F* Proton2DHistogram =
static_cast<TH2F*
>(HistListLambda->FindObject(
"hist_d1_2212_truncMomentum"));
771 TH1D* PionProfileBetaGamma =
static_cast<TH1D*
>(HistListDstar->FindObject(
"PionProfileBetaGamma"));
772 TH2F* Pion2DHistogram =
static_cast<TH2F*
>(HistListDstar->FindObject(
"hist_d1_211_truncMomentum"));
773 TH1D* KaonProfileBetaGamma =
static_cast<TH1D*
>(HistListDstar->FindObject(
"KaonProfileBetaGamma"));
774 TH2F* Kaon2DHistogram =
static_cast<TH2F*
>(HistListDstar->FindObject(
"hist_d1_321_truncMomentum"));
777 TH1D* ElectronProfileBetaGamma =
static_cast<TH1D*
>(HistListGamma->FindObject(
"ElectronProfileBetaGamma"));
778 TH2F* Electron2DHistogram =
static_cast<TH2F*
>(HistListGamma->FindObject(
"hist_d1_11_truncMomentum"));
780 int cred = TColor::GetColor(
"#e31a1c");
781 PionProfileBetaGamma->SetMarkerSize(4);
782 PionProfileBetaGamma->SetLineWidth(2);
783 PionProfileBetaGamma->SetMarkerColor(cred);
784 PionProfileBetaGamma->SetLineColor(cred);
786 int cpink = TColor::GetColor(
"#807dba");
787 KaonProfileBetaGamma->SetMarkerSize(4);
788 KaonProfileBetaGamma->SetLineWidth(2);
789 KaonProfileBetaGamma->SetMarkerColor(cpink);
790 KaonProfileBetaGamma->SetLineColor(cpink);
792 int cblue = TColor::GetColor(
"#084594");
793 ProtonProfileBetaGamma->SetMarkerSize(4);
794 ProtonProfileBetaGamma->SetLineWidth(2);
795 ProtonProfileBetaGamma->SetMarkerColor(cblue);
796 ProtonProfileBetaGamma->SetLineColor(cblue);
798 int cgreen = TColor::GetColor(
"#238b45");
799 ElectronProfileBetaGamma->SetMarkerSize(4);
800 ElectronProfileBetaGamma->SetLineWidth(2);
801 ElectronProfileBetaGamma->SetMarkerColor(cgreen);
802 ElectronProfileBetaGamma->SetLineColor(cgreen);
806 PionProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
807 KaonProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
808 ProtonProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
811 auto PionEdges = PionProfileBetaGamma->GetXaxis()->GetXbins()->GetArray();
812 auto ProtonEdges = ProtonProfileBetaGamma->GetXaxis()->GetXbins()->GetArray();
814 std::vector<float> CombinedEdgesVector;
816 double borderline = 3.;
818 for (
int i = 0; i < ProtonProfileBetaGamma->GetNbinsX() + 1; i++)
819 if (ProtonEdges[i] < borderline) CombinedEdgesVector.push_back(ProtonEdges[i]);
822 for (
int i = 0; i < PionProfileBetaGamma->GetNbinsX() + 1; i++)
823 if (PionEdges[i] > borderline) CombinedEdgesVector.push_back(PionEdges[i]);
826 TH1D* CombinedHistogramPAndPi =
new TH1D(
"CombinedHistogramPAndPi",
"histo_for_fit", CombinedEdgesVector.size() - 1,
827 CombinedEdgesVector.data());
830 for (
int i = 1; i < ProtonProfileBetaGamma->GetNbinsX() + 1; i++)
831 if (ProtonEdges[i - 1] < borderline) {
832 CombinedHistogramPAndPi->SetBinContent(i, ProtonProfileBetaGamma->GetBinContent(i));
833 CombinedHistogramPAndPi->SetBinError(i, ProtonProfileBetaGamma->GetBinError(i));
837 for (
int i = 1; i < PionProfileBetaGamma->GetNbinsX() + 1; i++)
838 if (PionEdges[i - 1] > borderline) {
840 CombinedHistogramPAndPi->SetBinContent(iterator, PionProfileBetaGamma->GetBinContent(i));
841 CombinedHistogramPAndPi->SetBinError(iterator, PionProfileBetaGamma->GetBinError(i));
846 TF1* BetaGammaFunctionPion =
new TF1(
"BetaGammaFunctionPion",
"[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4] + [6]* (x/[2])**0.5",
849 BetaGammaFunctionPion->SetNpx(1000);
851 BetaGammaFunctionPion->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
853 BetaGammaFunctionPion->SetParLimits(0, 3.e5, 7.e5);
854 BetaGammaFunctionPion->SetParLimits(1, -3.e4, 1.e4);
855 BetaGammaFunctionPion->SetParLimits(3, 0.1, 0.2);
856 BetaGammaFunctionPion->SetParLimits(4, 0.9, 1.6);
857 BetaGammaFunctionPion->SetParLimits(5, 3.e5, 7.e5);
858 BetaGammaFunctionPion->SetParLimits(6, 0., 1.e6);
859 BetaGammaFunctionPion->FixParameter(2, 1);
863 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Minuit2",
"Migrad");
864 auto FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0SI",
"", 0.4, 25);
866 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
867 BetaGammaFunctionPion->FixParameter(3, 0.15);
868 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0SI",
"", 0.4, 25);
870 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
871 BetaGammaFunctionPion->FixParameter(3, 0.15);
872 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0SI",
"", 0.45, 25);
874 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
875 BetaGammaFunctionPion->FixParameter(3, 0.15);
876 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0S",
"", 0.5, 25);
879 B2INFO(
"BetaGamma fit for pions done. Fit status: " << FitResultBetaGammaPion->Status());
881 B2INFO(
"Fit parameters:");
882 B2INFO(
"p0: " << BetaGammaFunctionPion->GetParameter(0) <<
" +- " << BetaGammaFunctionPion->GetParError(0));
883 B2INFO(
"p1: " << BetaGammaFunctionPion->GetParameter(1) <<
" +- " << BetaGammaFunctionPion->GetParError(1));
884 B2INFO(
"p2: " << BetaGammaFunctionPion->GetParameter(2) <<
" +- " << BetaGammaFunctionPion->GetParError(2));
885 B2INFO(
"p3: " << BetaGammaFunctionPion->GetParameter(3) <<
" +- " << BetaGammaFunctionPion->GetParError(3));
886 B2INFO(
"p4: " << BetaGammaFunctionPion->GetParameter(4) <<
" +- " << BetaGammaFunctionPion->GetParError(4));
887 B2INFO(
"p5: " << BetaGammaFunctionPion->GetParameter(5) <<
" +- " << BetaGammaFunctionPion->GetParError(5));
888 B2INFO(
"p6: " << BetaGammaFunctionPion->GetParameter(6) <<
" +- " << BetaGammaFunctionPion->GetParError(6));
891 TF1* BetaGammaFunctionKaon =
new TF1(
"BetaGammaFunctionKaon",
"[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4]+ [6]* (x/[2])**0.5",
894 BetaGammaFunctionKaon->SetNpx(1000);
895 BetaGammaFunctionKaon->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
897 BetaGammaFunctionKaon->SetParLimits(0, 3.e5, 7.e5);
898 BetaGammaFunctionKaon->SetParLimits(1, -3.e4, 1.e4);
899 BetaGammaFunctionKaon->SetParLimits(3, 0.1, 0.2);
900 BetaGammaFunctionKaon->SetParLimits(4, 0.9, 1.6);
901 BetaGammaFunctionKaon->SetParLimits(5, 3.e5, 7.e5);
902 BetaGammaFunctionKaon->SetParLimits(6, 0., 1.e6);
904 BetaGammaFunctionKaon->FixParameter(2, 1);
907 BetaGammaFunctionKaon->SetLineColor(KaonProfileBetaGamma->GetMarkerColor());
909 auto FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0SI",
"", 0.4, 8.5);
911 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
912 BetaGammaFunctionKaon->FixParameter(3, 0.15);
913 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0SI",
"", 0.4, 8.5);
915 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
916 BetaGammaFunctionKaon->FixParameter(3, 0.15);
917 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0SI",
"", 0.45, 8);
919 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
920 BetaGammaFunctionKaon->FixParameter(3, 0.15);
921 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0S",
"", 0.5, 8);
924 B2INFO(
"BetaGamma fit for kaons done. Fit status: " << FitResultBetaGammaKaon->Status());
925 B2INFO(
"Fit parameters:");
926 B2INFO(
"p0: " << BetaGammaFunctionKaon->GetParameter(0) <<
" +- " << BetaGammaFunctionKaon->GetParError(0));
927 B2INFO(
"p1: " << BetaGammaFunctionKaon->GetParameter(1) <<
" +- " << BetaGammaFunctionKaon->GetParError(1));
928 B2INFO(
"p2: " << BetaGammaFunctionKaon->GetParameter(2) <<
" +- " << BetaGammaFunctionKaon->GetParError(2));
929 B2INFO(
"p3: " << BetaGammaFunctionKaon->GetParameter(3) <<
" +- " << BetaGammaFunctionKaon->GetParError(3));
930 B2INFO(
"p4: " << BetaGammaFunctionKaon->GetParameter(4) <<
" +- " << BetaGammaFunctionKaon->GetParError(4));
931 B2INFO(
"p5: " << BetaGammaFunctionKaon->GetParameter(5) <<
" +- " << BetaGammaFunctionKaon->GetParError(5));
932 B2INFO(
"p6: " << BetaGammaFunctionKaon->GetParameter(6) <<
" +- " << BetaGammaFunctionKaon->GetParError(6));
935 TF1* BetaGammaFunctionProton =
new TF1(
"BetaGammaFunctionProton",
936 "[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4]+ [6]* (x/[2])**0.5", 0.01, 25.);
938 BetaGammaFunctionProton->SetNpx(1000);
940 BetaGammaFunctionProton->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
942 BetaGammaFunctionProton->SetParLimits(0, 3.e5, 7.e5);
943 BetaGammaFunctionProton->SetParLimits(1, -3.e4, 1.e4);
944 BetaGammaFunctionProton->SetParLimits(3, 0.1, 0.2);
945 BetaGammaFunctionProton->SetParLimits(4, 0.9, 1.6);
946 BetaGammaFunctionProton->SetParLimits(5, 3.e5, 7.e5);
947 BetaGammaFunctionProton->SetParLimits(6, 0., 1.e6);
949 BetaGammaFunctionProton->FixParameter(2, 1);
952 BetaGammaFunctionProton->SetLineColor(ProtonProfileBetaGamma->GetMarkerColor());
954 auto FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 15);
956 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
957 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
958 BetaGammaFunctionProton->FixParameter(3, 0.15);
959 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 15);
961 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
962 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
963 BetaGammaFunctionProton->FixParameter(3, 0.15);
964 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 10);
966 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
967 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
968 BetaGammaFunctionProton->FixParameter(3, 0.15);
969 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0S",
"", 0.5, 10);
972 B2INFO(
"BetaGamma fit for protons done. Fit status: " << FitResultBetaGammaProton->Status());
973 B2INFO(
"Fit parameters:");
974 B2INFO(
"p0: " << BetaGammaFunctionProton->GetParameter(0) <<
" +- " << BetaGammaFunctionProton->GetParError(0));
975 B2INFO(
"p1: " << BetaGammaFunctionProton->GetParameter(1) <<
" +- " << BetaGammaFunctionProton->GetParError(1));
976 B2INFO(
"p2: " << BetaGammaFunctionProton->GetParameter(2) <<
" +- " << BetaGammaFunctionProton->GetParError(2));
977 B2INFO(
"p3: " << BetaGammaFunctionProton->GetParameter(3) <<
" +- " << BetaGammaFunctionProton->GetParError(3));
978 B2INFO(
"p4: " << BetaGammaFunctionProton->GetParameter(4) <<
" +- " << BetaGammaFunctionProton->GetParError(4));
979 B2INFO(
"p5: " << BetaGammaFunctionProton->GetParameter(5) <<
" +- " << BetaGammaFunctionProton->GetParError(5));
980 B2INFO(
"p6: " << BetaGammaFunctionProton->GetParameter(6) <<
" +- " << BetaGammaFunctionProton->GetParError(6));
984 std::unique_ptr<TCanvas> CombinedCanvasHadrons(
new TCanvas(
"CombinedCanvasHadrons",
"Hadron beta*gamma fits", 10, 10, 1000, 700));
985 gStyle->SetOptFit(1111);
987 PionProfileBetaGamma->Draw();
988 PionProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionPion);
989 KaonProfileBetaGamma->Draw(
"SAME");
990 KaonProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionKaon);
991 ProtonProfileBetaGamma->Draw(
"SAME");
992 ProtonProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionProton);
996 auto legend =
new TLegend(0.4, 0.7, 0.65, 0.9);
997 legend->AddEntry(PionProfileBetaGamma,
"Pions",
"lep");
998 legend->AddEntry(KaonProfileBetaGamma,
"Kaons",
"lep");
999 legend->AddEntry(ProtonProfileBetaGamma,
"Protons",
"lep");
1005 CombinedCanvasHadrons->Print(
"HadronBetaGammaFits.pdf");
1006 TFile HadronFitPlotFile(
"SVDdEdxCalibrationHadronFitPlotFile.root",
"RECREATE");
1007 PionProfileBetaGamma->Write();
1008 KaonProfileBetaGamma->Write();
1009 ProtonProfileBetaGamma->Write();
1010 CombinedHistogramPAndPi->Write();
1011 BetaGammaFunctionPion->Write();
1012 BetaGammaFunctionKaon->Write();
1013 BetaGammaFunctionProton->Write();
1014 CombinedCanvasHadrons->Write();
1015 HadronFitPlotFile.Close();
1021 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionKaon"));
1022 BetaGammaFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionProton"));
1025 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionKaon"));
1026 BetaGammaFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionPion"));
1030 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
1031 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
1032 if (FitResultBetaGammaPion->Status() == 0) {
1033 BetaGammaFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionProton"));
1034 }
else if (FitResultBetaGammaKaon->Status() == 0) {
1035 BetaGammaFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionKaon->Clone(
"BetaGammaFunctionProton"));
1037 B2WARNING(
"Problem with the beta*gamma fit for protons, reverting to the default values");
1038 BetaGammaFunctionProton->SetParameters(450258, -10900.8, 1, 0.126797, 1.155, 641907, 86304.5);
1042 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
1043 if (FitResultBetaGammaProton->Status() == 0) {
1044 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionKaon"));
1045 }
else if (FitResultBetaGammaPion->Status() == 0) {
1046 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionKaon"));
1048 B2WARNING(
"Problem with the beta*gamma fit for kaons, reverting to the default values");
1049 BetaGammaFunctionKaon->SetParameters(543386, 3013.81, 1, 0.135517, 1.19742, 619509, 15484.4);
1053 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
1054 if (FitResultBetaGammaKaon->Status() == 0) {
1055 BetaGammaFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionKaon->Clone(
"BetaGammaFunctionPion"));
1056 }
else if (FitResultBetaGammaProton->Status() == 0) {
1057 BetaGammaFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionPion"));
1059 B2WARNING(
"Problem with the beta*gamma fit for pions, reverting to the default values");
1060 BetaGammaFunctionPion->SetParameters(537623, -1937.62, 1, 0.15292, 1.23803, 623678, 30400.9);
1067 TF1* BetaGammaFunctionElectron =
new TF1(
"BetaGammaFunctionElectron",
"[0] + [1]* x", 1, 10000.);
1068 BetaGammaFunctionElectron->SetParameters(6.e5, -1);
1069 BetaGammaFunctionElectron->SetParLimits(0, 3.e5, 8.e5);
1070 BetaGammaFunctionElectron->SetParLimits(1, -1.e5, 1.e5);
1071 auto FitResultBetaGammaElectron = ElectronProfileBetaGamma->Fit(
"BetaGammaFunctionElectron",
"0SI",
"", 100, 8000);
1074 if ((FitResultBetaGammaElectron->Status() > 1) || (BetaGammaFunctionElectron->Eval(1) < 3.e5)
1075 || (BetaGammaFunctionElectron->Eval(1) > 5.e6)) {
1076 FitResultBetaGammaElectron = ElectronProfileBetaGamma->Fit(
"BetaGammaFunctionElectron",
"0S",
"", 100, 10000);
1078 B2INFO(
"BetaGamma fit for electrons done. Fit status: " << FitResultBetaGammaElectron->Status());
1079 B2INFO(
"Fit parameters:");
1080 B2INFO(
"p0: " << BetaGammaFunctionElectron->GetParameter(0) <<
" +- " << BetaGammaFunctionElectron->GetParError(0));
1081 B2INFO(
"p1: " << BetaGammaFunctionElectron->GetParameter(1) <<
" +- " << BetaGammaFunctionElectron->GetParError(1));
1084 ElectronProfileBetaGamma->SetMarkerSize(4);
1085 ElectronProfileBetaGamma->SetLineWidth(2);
1086 ElectronProfileBetaGamma->GetYaxis()->SetRangeUser(5e5, 1e6);
1087 ElectronProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionElectron);
1090 std::unique_ptr<TCanvas> ElectronCanvas(
new TCanvas(
"ElectronCanvas",
"Electron histogram", 10, 10, 1000, 700));
1091 ElectronProfileBetaGamma->Draw();
1095 ElectronCanvas->Print(
"ElectronBetaGammaFits.pdf");
1096 TFile ElectronFitPlotFile(
"SVDdEdxCalibrationElectronFitPlotFile.root",
"RECREATE");
1097 ElectronProfileBetaGamma->Write();
1098 BetaGammaFunctionElectron->Write();
1099 ElectronCanvas->Write();
1100 ElectronFitPlotFile.Close();
1103 TF1* MomentumFunctionElectron =
static_cast<TF1*
>(BetaGammaFunctionElectron->Clone(
"MomentumFunctionElectron"));
1105 MomentumFunctionElectron->SetRange(0.01, 5.5);
1106 MomentumFunctionElectron->SetLineColor(kRed);
1107 MomentumFunctionElectron->SetLineWidth(4);
1109 TF1* MomentumFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"MomentumFunctionPion"));
1111 MomentumFunctionPion->SetRange(0.01, 5.5);
1112 MomentumFunctionPion->SetLineColor(kRed);
1113 MomentumFunctionPion->SetLineWidth(4);
1115 TF1* MomentumFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"MomentumFunctionProton"));
1117 MomentumFunctionProton->SetRange(0.01, 5.5);
1118 MomentumFunctionProton->SetLineColor(kRed);
1119 MomentumFunctionProton->SetLineWidth(4);
1121 TF1* MomentumFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionKaon->Clone(
"MomentumFunctionKaon"));
1123 MomentumFunctionKaon->SetRange(0.01, 5.5);
1124 MomentumFunctionKaon->SetLineColor(kRed);
1125 MomentumFunctionKaon->SetLineWidth(4);
1127 gStyle->SetOptFit(1111);
1128 std::unique_ptr<TCanvas> CanvasOverlays(
new TCanvas(
"CanvasOverlays",
"overlays", 1300, 1000));
1129 CanvasOverlays->Divide(2, 2);
1130 CanvasOverlays->cd(1); Electron2DHistogram->Draw(); MomentumFunctionElectron->Draw(
"SAME");
1131 CanvasOverlays->cd(2); Pion2DHistogram->Draw(); MomentumFunctionPion->Draw(
"SAME");
1132 CanvasOverlays->cd(3); Kaon2DHistogram->Draw(); MomentumFunctionKaon->Draw(
"SAME");
1133 CanvasOverlays->cd(4); Proton2DHistogram->Draw(); MomentumFunctionProton->Draw(
"SAME");
1134 CanvasOverlays->Print(
"SVDdEdxOverlaysFitsHistos.pdf");
1136 TF1* MomentumFunctionDeuteron =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"MomentumFunctionDeuteron"));
1138 MomentumFunctionDeuteron->SetRange(0.01, 5.5);
1139 MomentumFunctionDeuteron->SetLineColor(kRed);
1141 TF1* MomentumFunctionMuon =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"MomentumFunctionMuon"));
1143 MomentumFunctionMuon->SetRange(0.01, 5.5);
1144 MomentumFunctionMuon->SetLineColor(kRed);
1148 std::unique_ptr<TCanvas> OverlayAllTracksCanvas(
new TCanvas(
"OverlayAllTracksCanvas",
"The Ultimate Plot", 10, 10, 1000, 700));
1150 TH2F* AllTracksHistogram =
new TH2F(
"AllTracksHistogram",
"AllTracksHistogram;Momentum [GeV/c];dEdx [arb. units]", 1000, 0.05, 5,
1153 ttreeGeneric->Draw(
"TrackSVDdEdx:TrackSVDdEdxTrackMomentum>>AllTracksHistogram",
"TracknSVDHits>7",
"goff");
1154 AllTracksHistogram->Draw(
"COLZ");
1155 AllTracksHistogram->GetXaxis()->SetTitle(
"Momentum [GeV/c]");
1156 AllTracksHistogram->GetYaxis()->SetTitle(
"dE/dx [arbitrary units]");
1157 MomentumFunctionElectron->Draw(
"SAME");
1158 MomentumFunctionMuon->Draw(
"SAME");
1159 MomentumFunctionPion->Draw(
"SAME");
1160 MomentumFunctionKaon->Draw(
"SAME");
1161 MomentumFunctionProton->Draw(
"SAME");
1162 MomentumFunctionDeuteron->Draw(
"SAME");
1163 OverlayAllTracksCanvas->SetLogx();
1164 OverlayAllTracksCanvas->SetLogz();
1166 OverlayAllTracksCanvas->Print(
"SVDdEdxAllTracksWithFits.pdf");
1167 TFile OverlayAllTracksPlotFile(
"SVDdEdxCalibrationOverlayAllTracks.root",
"RECREATE");
1168 AllTracksHistogram->Write();
1169 MomentumFunctionElectron->Write();
1170 MomentumFunctionMuon->Write();
1171 MomentumFunctionPion->Write();
1172 MomentumFunctionKaon->Write();
1173 MomentumFunctionProton->Write();
1174 MomentumFunctionDeuteron->Write();
1175 OverlayAllTracksCanvas->Write();
1176 OverlayAllTracksPlotFile.Close();
1182 double PionRangeMin = 0.6;
1183 double PionRangeMax = 1.;
1184 double KaonRangeMin = 1.9;
1185 double KaonRangeMax = 3;
1186 double ElectronRangeMin = 1.;
1187 double ElectronRangeMax = 1.4;
1189 auto PionResolutionHistogram = Pion2DHistogram->ProjectionY(
"PionResolutionHistogram",
1190 Pion2DHistogram->GetXaxis()->FindBin(PionRangeMin),
1191 Pion2DHistogram->GetXaxis()->FindBin(PionRangeMax));
1192 auto ElectronResolutionHistogram = Electron2DHistogram->ProjectionY(
"ElectronResolutionHistogram",
1193 Electron2DHistogram->GetXaxis()->FindBin(ElectronRangeMin), Electron2DHistogram->GetXaxis()->FindBin(ElectronRangeMax));
1194 auto KaonResolutionHistogram = Kaon2DHistogram->ProjectionY(
"KaonResolutionHistogram",
1195 Kaon2DHistogram->GetXaxis()->FindBin(KaonRangeMin),
1196 Kaon2DHistogram->GetXaxis()->FindBin(KaonRangeMax));
1200 TF1* PionResolutionFunction =
new TF1(
"PionResolutionFunction",
1201 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 100e3, 1500e3);
1206 PionResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1207 PionResolutionFunction->SetParLimits(0, 0, 500);
1208 PionResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1209 PionResolutionFunction->SetParLimits(2, 0, 1);
1210 PionResolutionFunction->SetParLimits(3, 0, 500);
1211 PionResolutionFunction->SetParLimits(4, 0, 7);
1212 PionResolutionFunction->SetParLimits(5, 1, 7);
1213 PionResolutionFunction->SetNpx(1000);
1214 auto FitResultResolutionPion = PionResolutionHistogram->Fit(PionResolutionFunction,
"RSI");
1216 B2INFO(
"relative resolution for pions: " << PionResolutionFunction->GetParameter(2));
1217 B2INFO(
"resolution for pions: fit status" << FitResultResolutionPion->Status());
1219 TF1* KaonResolutionFunction =
new TF1(
"KaonResolutionFunction",
1220 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 100e3, 1500e3);
1223 KaonResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1224 KaonResolutionFunction->SetParLimits(0, 0, 500);
1225 KaonResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1226 KaonResolutionFunction->SetParLimits(2, 0, 1);
1227 KaonResolutionFunction->SetParLimits(3, 0, 500);
1228 KaonResolutionFunction->SetParLimits(4, 0, 7);
1229 KaonResolutionFunction->SetParLimits(5, 1, 7);
1230 KaonResolutionFunction->SetNpx(1000);
1231 auto FitResultResolutionKaon = KaonResolutionHistogram->Fit(KaonResolutionFunction,
"RSI");
1233 B2INFO(
"relative resolution for kaons: " << KaonResolutionFunction->GetParameter(2));
1234 B2INFO(
"resolution for kaons: fit status" << FitResultResolutionKaon->Status());
1236 if ((FitResultResolutionKaon->Status() > 1)
1237 && (FitResultResolutionPion->Status() <= 1)) KaonResolutionFunction =
static_cast<TF1*
>
1238 (PionResolutionFunction->Clone(
"KaonResolutionFunction"));
1243 TF1* ElectronResolutionFunction =
new TF1(
"ElectronResolutionFunction",
1244 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 50e3, 1500e3);
1247 ElectronResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1248 ElectronResolutionFunction->SetParLimits(0, 0, 500);
1249 ElectronResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1250 ElectronResolutionFunction->SetParLimits(2, 0, 1);
1251 ElectronResolutionFunction->SetParLimits(3, 0, 500);
1252 ElectronResolutionFunction->SetParLimits(4, 0, 7);
1253 ElectronResolutionFunction->SetParLimits(5, 1, 7);
1254 ElectronResolutionFunction->SetNpx(1000);
1255 auto FitResultResolutionElectron = ElectronResolutionHistogram->Fit(ElectronResolutionFunction,
"RSI");
1257 B2INFO(
"relative resolution for electrons: " << ElectronResolutionFunction->GetParameter(2));
1258 B2INFO(
"resolution for electrons: fit status" << FitResultResolutionElectron->Status());
1262 TCanvas* CanvasResolutions =
new TCanvas(
"CanvasResolutions",
"Resolutions", 1200, 650);
1263 CanvasResolutions->Divide(3, 1);
1264 CanvasResolutions->cd(1); PionResolutionHistogram->Draw();
1265 CanvasResolutions->cd(2); KaonResolutionHistogram->Draw();
1266 CanvasResolutions->cd(3); ElectronResolutionHistogram->Draw();
1268 CanvasResolutions->Print(
"SVDdEdxResolutions.pdf");
1269 TFile OverlayResolutionsPlotFile(
"SVDdEdxCalibrationResolutions.root",
"RECREATE");
1270 PionResolutionHistogram->Write();
1271 KaonResolutionHistogram->Write();
1272 ElectronResolutionHistogram->Write();
1273 CanvasResolutions->Write();
1274 OverlayResolutionsPlotFile.Close();
1280 double BiasCorrectionPion = PionResolutionFunction->GetParameter(1) - MomentumFunctionPion->Eval((
1281 PionRangeMax + PionRangeMin) / 2.);
1282 B2INFO(
"BiasCorrectionPion = " << BiasCorrectionPion);
1285 TH2F* Pion2DHistogramNew =
PrepareNewHistogram(Pion2DHistogram, Form(
"%sNew", Pion2DHistogram->GetName()), MomentumFunctionPion,
1286 PionResolutionFunction, BiasCorrectionPion);
1289 TH2F* Pion2DHistogramResidual =
static_cast<TH2F*
>(Pion2DHistogram->Clone(
"Pion2DHistogramResidual"));
1290 Pion2DHistogramResidual->Add(Pion2DHistogramNew, Pion2DHistogram, 1, -1);
1291 Pion2DHistogramResidual->SetMinimum(-0.15);
1292 Pion2DHistogramResidual->SetMaximum(0.15);
1295 double BiasCorrectionKaon = KaonResolutionFunction->GetParameter(1) - MomentumFunctionKaon->Eval((
1296 KaonRangeMax + KaonRangeMin) / 2.);
1297 B2INFO(
"BiasCorrectionKaon = " << BiasCorrectionKaon);
1301 double BiasCorrectionProton = KaonResolutionFunction->GetParameter(1) - MomentumFunctionProton->Eval(3.);
1302 B2INFO(
"BiasCorrectionProton = " << BiasCorrectionProton);
1304 if ((BiasCorrectionProton / BiasCorrectionKaon) > 1.5) BiasCorrectionProton =
1308 TH2F* Kaon2DHistogramNew =
PrepareNewHistogram(Kaon2DHistogram, Form(
"%sNew", Kaon2DHistogram->GetName()), MomentumFunctionKaon,
1309 KaonResolutionFunction, BiasCorrectionKaon);
1311 TH2F* Kaon2DHistogramResidual =
static_cast<TH2F*
>(Kaon2DHistogram->Clone(
"Kaon2DHistogramResidual"));
1312 Kaon2DHistogramResidual->Add(Kaon2DHistogramNew, Kaon2DHistogram, 1, -1);
1313 Kaon2DHistogramResidual->SetMinimum(-0.15);
1314 Kaon2DHistogramResidual->SetMaximum(0.15);
1317 TH2F* Proton2DHistogramNew =
PrepareNewHistogram(Proton2DHistogram, Form(
"%sNew", Proton2DHistogram->GetName()),
1318 MomentumFunctionProton,
1319 KaonResolutionFunction, BiasCorrectionProton);
1322 TH2F* Proton2DHistogramResidual =
static_cast<TH2F*
>(Proton2DHistogram->Clone(
"Proton2DHistogramResidual"));
1323 Proton2DHistogramResidual->Add(Proton2DHistogramNew, Proton2DHistogram, 1, -1);
1324 Proton2DHistogramResidual->SetMinimum(-0.15);
1325 Proton2DHistogramResidual->SetMaximum(0.15);
1328 TH2F* Deuteron2DHistogramNew =
PrepareNewHistogram(Proton2DHistogram,
"Deuteron2DHistogramNew", MomentumFunctionDeuteron,
1329 KaonResolutionFunction,
1330 BiasCorrectionKaon);
1331 Deuteron2DHistogramNew->SetTitle(
"hist_d1_1000010020_trunc");
1334 TH2F* Muon2DHistogramNew =
PrepareNewHistogram(Pion2DHistogram,
"Muon2DHistogramNew", MomentumFunctionMuon, PionResolutionFunction,
1335 BiasCorrectionPion);
1336 Muon2DHistogramNew->SetTitle(
"hist_d1_13_trunc");
1339 double BiasCorrectionElectron = ElectronResolutionFunction->GetParameter(1) - MomentumFunctionElectron->Eval((
1340 ElectronRangeMax + ElectronRangeMin) / 2.);
1341 B2INFO(
"BiasCorrectionElectron = " << BiasCorrectionElectron);
1342 TH2F* Electron2DHistogramNew =
PrepareNewHistogram(Electron2DHistogram, Form(
"%sNew", Electron2DHistogram->GetName()),
1343 MomentumFunctionElectron,
1344 ElectronResolutionFunction, BiasCorrectionElectron);
1346 TH2F* Electron2DHistogramResidual =
static_cast<TH2F*
>(Electron2DHistogram->Clone(
"Electron2DHistogramResidual"));
1347 Electron2DHistogramResidual->Add(Electron2DHistogramNew, Electron2DHistogram, 1, -1);
1348 Electron2DHistogramResidual->SetMinimum(-0.15);
1349 Electron2DHistogramResidual->SetMaximum(0.15);
1351 Electron2DHistogramNew->SetName(
"Electron2DHistogramNew");
1352 Muon2DHistogramNew->SetName(
"Muon2DHistogramNew");
1353 Pion2DHistogramNew->SetName(
"Pion2DHistogramNew");
1354 Kaon2DHistogramNew->SetName(
"Kaon2DHistogramNew");
1355 Proton2DHistogramNew->SetName(
"Proton2DHistogramNew");
1356 Deuteron2DHistogramNew->SetName(
"Deuteron2DHistogramNew");
1360 TCanvas* CanvasSummaryGenerated =
new TCanvas(
"CanvasSummaryGenerated",
"Generated payloads", 1700, 850);
1361 CanvasSummaryGenerated->Divide(3, 2);
1362 CanvasSummaryGenerated->cd(1); Electron2DHistogramNew->Draw(
"COLZ");
1363 CanvasSummaryGenerated->cd(2); Muon2DHistogramNew->Draw(
"COLZ");
1364 CanvasSummaryGenerated->cd(3); Pion2DHistogramNew->Draw(
"COLZ");
1365 CanvasSummaryGenerated->cd(4); Kaon2DHistogramNew->Draw(
"COLZ");
1366 CanvasSummaryGenerated->cd(5); Proton2DHistogramNew->Draw(
"COLZ");
1367 CanvasSummaryGenerated->cd(6); Deuteron2DHistogramNew->Draw(
"COLZ");
1369 CanvasSummaryGenerated->Print(
"SVDdEdxGeneratedPayloads.pdf");
1370 TFile SummaryGeneratedPlotFile(
"SVDdEdxCalibrationSummaryGenerated.root",
"RECREATE");
1371 Electron2DHistogramNew->Write();
1372 Muon2DHistogramNew->Write();
1373 Pion2DHistogramNew->Write();
1374 Kaon2DHistogramNew->Write();
1375 Proton2DHistogramNew->Write();
1376 Deuteron2DHistogramNew->Write();
1377 SummaryGeneratedPlotFile.Close();
1380 TCanvas* CanvasSummaryData =
new TCanvas(
"CanvasSummaryData",
"Data distributions", 1700, 850);
1381 CanvasSummaryData->Divide(3, 2);
1382 CanvasSummaryData->cd(1); Electron2DHistogram->Draw(
"COLZ");
1383 CanvasSummaryData->cd(3); Pion2DHistogram->Draw(
"COLZ");
1384 CanvasSummaryData->cd(4); Kaon2DHistogram->Draw(
"COLZ");
1385 CanvasSummaryData->cd(5); Proton2DHistogram->Draw(
"COLZ");
1387 CanvasSummaryData->Print(
"SVDdEdxDataDistributions.pdf");
1388 TFile SummaryDataPlotFile(
"SVDdEdxCalibrationSummaryData.root",
"RECREATE");
1389 Electron2DHistogram->Write();
1390 Pion2DHistogram->Write();
1391 Kaon2DHistogram->Write();
1392 Proton2DHistogram->Write();
1393 SummaryDataPlotFile.Close();
1396 TCanvas* CanvasSummaryResiduals =
new TCanvas(
"CanvasSummaryResiduals",
"Residuals", 1700, 850);
1397 CanvasSummaryResiduals->Divide(3, 2);
1398 CanvasSummaryResiduals->cd(1); Electron2DHistogramResidual->Draw(
"COLZ");
1399 CanvasSummaryResiduals->cd(3); Pion2DHistogramResidual->Draw(
"COLZ");
1400 CanvasSummaryResiduals->cd(4); Kaon2DHistogramResidual->Draw(
"COLZ");
1401 CanvasSummaryResiduals->cd(5); Proton2DHistogramResidual->Draw(
"COLZ");
1404 CanvasSummaryResiduals->Print(
"SVDdEdxResiduals.pdf");
1405 TFile SummaryResidualsPlotFile(
"SVDdEdxCalibrationSummaryResiduals.root",
"RECREATE");
1406 Electron2DHistogramResidual->Write();
1407 Pion2DHistogramResidual->Write();
1408 Kaon2DHistogramResidual->Write();
1409 Proton2DHistogramResidual->Write();
1410 SummaryResidualsPlotFile.Close();
1415 std::unique_ptr<TList> histList(
new TList);
1416 histList->Add(Electron2DHistogramNew);
1417 histList->Add(Muon2DHistogramNew);
1418 histList->Add(Pion2DHistogramNew);
1419 histList->Add(Kaon2DHistogramNew);
1420 histList->Add(Proton2DHistogramNew);
1421 histList->Add(Deuteron2DHistogramNew);