768 std::shared_ptr<TTree> ttreeDstar,
769 std::shared_ptr<TTree> ttreeGamma, std::shared_ptr<TTree> ttreeGeneric)
771 gROOT->SetBatch(
true);
772 gStyle->SetOptStat(0);
776 TH1D* ProtonProfileBetaGamma =
static_cast<TH1D*
>(HistListLambda->FindObject(
"ProtonProfileBetaGamma"));
777 TH2F* Proton2DHistogram =
static_cast<TH2F*
>(HistListLambda->FindObject(
"hist_d1_2212_truncMomentum"));
781 TH1D* PionProfileBetaGamma =
static_cast<TH1D*
>(HistListDstar->FindObject(
"PionProfileBetaGamma"));
782 TH2F* Pion2DHistogram =
static_cast<TH2F*
>(HistListDstar->FindObject(
"hist_d1_211_truncMomentum"));
783 TH1D* KaonProfileBetaGamma =
static_cast<TH1D*
>(HistListDstar->FindObject(
"KaonProfileBetaGamma"));
784 TH2F* Kaon2DHistogram =
static_cast<TH2F*
>(HistListDstar->FindObject(
"hist_d1_321_truncMomentum"));
787 TH1D* ElectronProfileBetaGamma =
static_cast<TH1D*
>(HistListGamma->FindObject(
"ElectronProfileBetaGamma"));
788 TH2F* Electron2DHistogram =
static_cast<TH2F*
>(HistListGamma->FindObject(
"hist_d1_11_truncMomentum"));
790 int cred = TColor::GetColor(
"#e31a1c");
791 PionProfileBetaGamma->SetMarkerSize(4);
792 PionProfileBetaGamma->SetLineWidth(2);
793 PionProfileBetaGamma->SetMarkerColor(cred);
794 PionProfileBetaGamma->SetLineColor(cred);
796 int cpink = TColor::GetColor(
"#807dba");
797 KaonProfileBetaGamma->SetMarkerSize(4);
798 KaonProfileBetaGamma->SetLineWidth(2);
799 KaonProfileBetaGamma->SetMarkerColor(cpink);
800 KaonProfileBetaGamma->SetLineColor(cpink);
802 int cblue = TColor::GetColor(
"#084594");
803 ProtonProfileBetaGamma->SetMarkerSize(4);
804 ProtonProfileBetaGamma->SetLineWidth(2);
805 ProtonProfileBetaGamma->SetMarkerColor(cblue);
806 ProtonProfileBetaGamma->SetLineColor(cblue);
808 int cgreen = TColor::GetColor(
"#238b45");
809 ElectronProfileBetaGamma->SetMarkerSize(4);
810 ElectronProfileBetaGamma->SetLineWidth(2);
811 ElectronProfileBetaGamma->SetMarkerColor(cgreen);
812 ElectronProfileBetaGamma->SetLineColor(cgreen);
816 PionProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
817 KaonProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
818 ProtonProfileBetaGamma->GetYaxis()->SetRangeUser(5.e5, 5.5e6);
821 auto PionEdges = PionProfileBetaGamma->GetXaxis()->GetXbins()->GetArray();
822 auto ProtonEdges = ProtonProfileBetaGamma->GetXaxis()->GetXbins()->GetArray();
824 std::vector<float> CombinedEdgesVector;
826 double borderline = 3.;
828 for (
int i = 0; i < ProtonProfileBetaGamma->GetNbinsX() + 1; i++)
829 if (ProtonEdges[i] < borderline) CombinedEdgesVector.push_back(ProtonEdges[i]);
832 for (
int i = 0; i < PionProfileBetaGamma->GetNbinsX() + 1; i++)
833 if (PionEdges[i] > borderline) CombinedEdgesVector.push_back(PionEdges[i]);
836 TH1D* CombinedHistogramPAndPi =
new TH1D(
"CombinedHistogramPAndPi",
"histo_for_fit", CombinedEdgesVector.size() - 1,
837 CombinedEdgesVector.data());
840 for (
int i = 1; i < ProtonProfileBetaGamma->GetNbinsX() + 1; i++)
841 if (ProtonEdges[i - 1] < borderline) {
842 CombinedHistogramPAndPi->SetBinContent(i, ProtonProfileBetaGamma->GetBinContent(i));
843 CombinedHistogramPAndPi->SetBinError(i, ProtonProfileBetaGamma->GetBinError(i));
847 for (
int i = 1; i < PionProfileBetaGamma->GetNbinsX() + 1; i++)
848 if (PionEdges[i - 1] > borderline) {
850 CombinedHistogramPAndPi->SetBinContent(iterator, PionProfileBetaGamma->GetBinContent(i));
851 CombinedHistogramPAndPi->SetBinError(iterator, PionProfileBetaGamma->GetBinError(i));
856 TF1* BetaGammaFunctionPion =
new TF1(
"BetaGammaFunctionPion",
"[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4] + [6]* (x/[2])**0.5",
859 BetaGammaFunctionPion->SetNpx(1000);
861 BetaGammaFunctionPion->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
863 BetaGammaFunctionPion->SetParLimits(0, 3.e5, 7.e5);
864 BetaGammaFunctionPion->SetParLimits(1, -3.e4, 1.e4);
865 BetaGammaFunctionPion->SetParLimits(3, 0.1, 0.2);
866 BetaGammaFunctionPion->SetParLimits(4, 0.9, 1.6);
867 BetaGammaFunctionPion->SetParLimits(5, 3.e5, 7.e5);
868 BetaGammaFunctionPion->SetParLimits(6, 0., 1.e6);
869 BetaGammaFunctionPion->FixParameter(2, 1);
873 ROOT::Math::MinimizerOptions::SetDefaultMinimizer(
"Minuit2",
"Migrad");
874 auto 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.4, 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",
"0SI",
"", 0.45, 25);
884 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
885 BetaGammaFunctionPion->FixParameter(3, 0.15);
886 FitResultBetaGammaPion = PionProfileBetaGamma->Fit(
"BetaGammaFunctionPion",
"0S",
"", 0.5, 25);
889 B2INFO(
"BetaGamma fit for pions done. Fit status: " << FitResultBetaGammaPion->Status());
891 B2INFO(
"Fit parameters:");
892 B2INFO(
"p0: " << BetaGammaFunctionPion->GetParameter(0) <<
" +- " << BetaGammaFunctionPion->GetParError(0));
893 B2INFO(
"p1: " << BetaGammaFunctionPion->GetParameter(1) <<
" +- " << BetaGammaFunctionPion->GetParError(1));
894 B2INFO(
"p2: " << BetaGammaFunctionPion->GetParameter(2) <<
" +- " << BetaGammaFunctionPion->GetParError(2));
895 B2INFO(
"p3: " << BetaGammaFunctionPion->GetParameter(3) <<
" +- " << BetaGammaFunctionPion->GetParError(3));
896 B2INFO(
"p4: " << BetaGammaFunctionPion->GetParameter(4) <<
" +- " << BetaGammaFunctionPion->GetParError(4));
897 B2INFO(
"p5: " << BetaGammaFunctionPion->GetParameter(5) <<
" +- " << BetaGammaFunctionPion->GetParError(5));
898 B2INFO(
"p6: " << BetaGammaFunctionPion->GetParameter(6) <<
" +- " << BetaGammaFunctionPion->GetParError(6));
901 TF1* BetaGammaFunctionKaon =
new TF1(
"BetaGammaFunctionKaon",
"[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4]+ [6]* (x/[2])**0.5",
904 BetaGammaFunctionKaon->SetNpx(1000);
905 BetaGammaFunctionKaon->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
907 BetaGammaFunctionKaon->SetParLimits(0, 3.e5, 7.e5);
908 BetaGammaFunctionKaon->SetParLimits(1, -3.e4, 1.e4);
909 BetaGammaFunctionKaon->SetParLimits(3, 0.1, 0.2);
910 BetaGammaFunctionKaon->SetParLimits(4, 0.9, 1.6);
911 BetaGammaFunctionKaon->SetParLimits(5, 3.e5, 7.e5);
912 BetaGammaFunctionKaon->SetParLimits(6, 0., 1.e6);
914 BetaGammaFunctionKaon->FixParameter(2, 1);
917 BetaGammaFunctionKaon->SetLineColor(KaonProfileBetaGamma->GetMarkerColor());
919 auto 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.4, 8.5);
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",
"0SI",
"", 0.45, 8);
929 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
930 BetaGammaFunctionKaon->FixParameter(3, 0.15);
931 FitResultBetaGammaKaon = KaonProfileBetaGamma->Fit(
"BetaGammaFunctionKaon",
"0S",
"", 0.5, 8);
934 B2INFO(
"BetaGamma fit for kaons done. Fit status: " << FitResultBetaGammaKaon->Status());
935 B2INFO(
"Fit parameters:");
936 B2INFO(
"p0: " << BetaGammaFunctionKaon->GetParameter(0) <<
" +- " << BetaGammaFunctionKaon->GetParError(0));
937 B2INFO(
"p1: " << BetaGammaFunctionKaon->GetParameter(1) <<
" +- " << BetaGammaFunctionKaon->GetParError(1));
938 B2INFO(
"p2: " << BetaGammaFunctionKaon->GetParameter(2) <<
" +- " << BetaGammaFunctionKaon->GetParError(2));
939 B2INFO(
"p3: " << BetaGammaFunctionKaon->GetParameter(3) <<
" +- " << BetaGammaFunctionKaon->GetParError(3));
940 B2INFO(
"p4: " << BetaGammaFunctionKaon->GetParameter(4) <<
" +- " << BetaGammaFunctionKaon->GetParError(4));
941 B2INFO(
"p5: " << BetaGammaFunctionKaon->GetParameter(5) <<
" +- " << BetaGammaFunctionKaon->GetParError(5));
942 B2INFO(
"p6: " << BetaGammaFunctionKaon->GetParameter(6) <<
" +- " << BetaGammaFunctionKaon->GetParError(6));
945 TF1* BetaGammaFunctionProton =
new TF1(
"BetaGammaFunctionProton",
946 "[0] + [1] * x/[2] + [5]/(x^2/[2]^2 + [3])**[4]+ [6]* (x/[2])**0.5", 0.01, 25.);
948 BetaGammaFunctionProton->SetNpx(1000);
950 BetaGammaFunctionProton->SetParameters(5.e5, 2.e3, 1, 0.15, 1.2, 6.e5, 3.e5);
952 BetaGammaFunctionProton->SetParLimits(0, 3.e5, 7.e5);
953 BetaGammaFunctionProton->SetParLimits(1, -3.e4, 1.e4);
954 BetaGammaFunctionProton->SetParLimits(3, 0.1, 0.2);
955 BetaGammaFunctionProton->SetParLimits(4, 0.9, 1.6);
956 BetaGammaFunctionProton->SetParLimits(5, 3.e5, 7.e5);
957 BetaGammaFunctionProton->SetParLimits(6, 0., 1.e6);
959 BetaGammaFunctionProton->FixParameter(2, 1);
962 BetaGammaFunctionProton->SetLineColor(ProtonProfileBetaGamma->GetMarkerColor());
964 auto FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 15);
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",
"0SI",
"", 0.45, 15);
971 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
972 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
973 BetaGammaFunctionProton->FixParameter(3, 0.15);
974 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0SI",
"", 0.45, 10);
976 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
977 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
978 BetaGammaFunctionProton->FixParameter(3, 0.15);
979 FitResultBetaGammaProton = CombinedHistogramPAndPi->Fit(
"BetaGammaFunctionProton",
"0S",
"", 0.5, 10);
982 B2INFO(
"BetaGamma fit for protons done. Fit status: " << FitResultBetaGammaProton->Status());
983 B2INFO(
"Fit parameters:");
984 B2INFO(
"p0: " << BetaGammaFunctionProton->GetParameter(0) <<
" +- " << BetaGammaFunctionProton->GetParError(0));
985 B2INFO(
"p1: " << BetaGammaFunctionProton->GetParameter(1) <<
" +- " << BetaGammaFunctionProton->GetParError(1));
986 B2INFO(
"p2: " << BetaGammaFunctionProton->GetParameter(2) <<
" +- " << BetaGammaFunctionProton->GetParError(2));
987 B2INFO(
"p3: " << BetaGammaFunctionProton->GetParameter(3) <<
" +- " << BetaGammaFunctionProton->GetParError(3));
988 B2INFO(
"p4: " << BetaGammaFunctionProton->GetParameter(4) <<
" +- " << BetaGammaFunctionProton->GetParError(4));
989 B2INFO(
"p5: " << BetaGammaFunctionProton->GetParameter(5) <<
" +- " << BetaGammaFunctionProton->GetParError(5));
990 B2INFO(
"p6: " << BetaGammaFunctionProton->GetParameter(6) <<
" +- " << BetaGammaFunctionProton->GetParError(6));
994 std::unique_ptr<TCanvas> CombinedCanvasHadrons(
new TCanvas(
"CombinedCanvasHadrons",
"Hadron beta*gamma fits", 10, 10, 1000, 700));
995 gStyle->SetOptFit(1111);
997 PionProfileBetaGamma->Draw();
998 PionProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionPion);
999 KaonProfileBetaGamma->Draw(
"SAME");
1000 KaonProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionKaon);
1001 ProtonProfileBetaGamma->Draw(
"SAME");
1002 ProtonProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionProton);
1006 auto legend =
new TLegend(0.4, 0.7, 0.65, 0.9);
1007 legend->AddEntry(PionProfileBetaGamma,
"Pions",
"lep");
1008 legend->AddEntry(KaonProfileBetaGamma,
"Kaons",
"lep");
1009 legend->AddEntry(ProtonProfileBetaGamma,
"Protons",
"lep");
1015 CombinedCanvasHadrons->Print(
"HadronBetaGammaFits.pdf");
1016 TFile HadronFitPlotFile(
"SVDdEdxCalibrationHadronFitPlotFile.root",
"RECREATE");
1017 PionProfileBetaGamma->Write();
1018 KaonProfileBetaGamma->Write();
1019 ProtonProfileBetaGamma->Write();
1020 CombinedHistogramPAndPi->Write();
1021 BetaGammaFunctionPion->Write();
1022 BetaGammaFunctionKaon->Write();
1023 BetaGammaFunctionProton->Write();
1024 CombinedCanvasHadrons->Write();
1025 HadronFitPlotFile.Close();
1031 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionKaon"));
1032 BetaGammaFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionProton"));
1035 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionKaon"));
1036 BetaGammaFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionPion"));
1040 if ((FitResultBetaGammaProton->Status() > 1) || (BetaGammaFunctionProton->Eval(1) < 5.e5)
1041 || (BetaGammaFunctionProton->Eval(1) > 5.e6)) {
1042 if (FitResultBetaGammaPion->Status() == 0) {
1043 BetaGammaFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionProton"));
1044 }
else if (FitResultBetaGammaKaon->Status() == 0) {
1045 BetaGammaFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionKaon->Clone(
"BetaGammaFunctionProton"));
1047 B2WARNING(
"Problem with the beta*gamma fit for protons, reverting to the default values");
1048 BetaGammaFunctionProton->SetParameters(450258, -10900.8, 1, 0.126797, 1.155, 641907, 86304.5);
1052 if ((FitResultBetaGammaKaon->Status() > 1) || (BetaGammaFunctionKaon->Eval(1) < 5.e5) || (BetaGammaFunctionKaon->Eval(1) > 5.e6)) {
1053 if (FitResultBetaGammaProton->Status() == 0) {
1054 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionKaon"));
1055 }
else if (FitResultBetaGammaPion->Status() == 0) {
1056 BetaGammaFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"BetaGammaFunctionKaon"));
1058 B2WARNING(
"Problem with the beta*gamma fit for kaons, reverting to the default values");
1059 BetaGammaFunctionKaon->SetParameters(543386, 3013.81, 1, 0.135517, 1.19742, 619509, 15484.4);
1063 if ((FitResultBetaGammaPion->Status() > 1) || (BetaGammaFunctionPion->Eval(1) < 5.e5) || (BetaGammaFunctionPion->Eval(1) > 5.e6)) {
1064 if (FitResultBetaGammaKaon->Status() == 0) {
1065 BetaGammaFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionKaon->Clone(
"BetaGammaFunctionPion"));
1066 }
else if (FitResultBetaGammaProton->Status() == 0) {
1067 BetaGammaFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"BetaGammaFunctionPion"));
1069 B2WARNING(
"Problem with the beta*gamma fit for pions, reverting to the default values");
1070 BetaGammaFunctionPion->SetParameters(537623, -1937.62, 1, 0.15292, 1.23803, 623678, 30400.9);
1077 TF1* BetaGammaFunctionElectron =
new TF1(
"BetaGammaFunctionElectron",
"[0] + [1]* x", 1, 10000.);
1078 BetaGammaFunctionElectron->SetParameters(6.e5, -1);
1079 BetaGammaFunctionElectron->SetParLimits(0, 3.e5, 8.e5);
1080 BetaGammaFunctionElectron->SetParLimits(1, -1.e5, 1.e5);
1081 auto FitResultBetaGammaElectron = ElectronProfileBetaGamma->Fit(
"BetaGammaFunctionElectron",
"0SI",
"", 100, 8000);
1084 if ((FitResultBetaGammaElectron->Status() > 1) || (BetaGammaFunctionElectron->Eval(1) < 3.e5)
1085 || (BetaGammaFunctionElectron->Eval(1) > 5.e6)) {
1086 FitResultBetaGammaElectron = ElectronProfileBetaGamma->Fit(
"BetaGammaFunctionElectron",
"0S",
"", 100, 10000);
1088 B2INFO(
"BetaGamma fit for electrons done. Fit status: " << FitResultBetaGammaElectron->Status());
1089 B2INFO(
"Fit parameters:");
1090 B2INFO(
"p0: " << BetaGammaFunctionElectron->GetParameter(0) <<
" +- " << BetaGammaFunctionElectron->GetParError(0));
1091 B2INFO(
"p1: " << BetaGammaFunctionElectron->GetParameter(1) <<
" +- " << BetaGammaFunctionElectron->GetParError(1));
1094 ElectronProfileBetaGamma->SetMarkerSize(4);
1095 ElectronProfileBetaGamma->SetLineWidth(2);
1096 ElectronProfileBetaGamma->GetYaxis()->SetRangeUser(5e5, 1e6);
1097 ElectronProfileBetaGamma->GetListOfFunctions()->Add(BetaGammaFunctionElectron);
1100 std::unique_ptr<TCanvas> ElectronCanvas(
new TCanvas(
"ElectronCanvas",
"Electron histogram", 10, 10, 1000, 700));
1101 ElectronProfileBetaGamma->Draw();
1105 ElectronCanvas->Print(
"ElectronBetaGammaFits.pdf");
1106 TFile ElectronFitPlotFile(
"SVDdEdxCalibrationElectronFitPlotFile.root",
"RECREATE");
1107 ElectronProfileBetaGamma->Write();
1108 BetaGammaFunctionElectron->Write();
1109 ElectronCanvas->Write();
1110 ElectronFitPlotFile.Close();
1113 TF1* MomentumFunctionElectron =
static_cast<TF1*
>(BetaGammaFunctionElectron->Clone(
"MomentumFunctionElectron"));
1115 MomentumFunctionElectron->SetRange(0.01, 5.5);
1116 MomentumFunctionElectron->SetLineColor(kRed);
1117 MomentumFunctionElectron->SetLineWidth(4);
1119 TF1* MomentumFunctionPion =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"MomentumFunctionPion"));
1121 MomentumFunctionPion->SetRange(0.01, 5.5);
1122 MomentumFunctionPion->SetLineColor(kRed);
1123 MomentumFunctionPion->SetLineWidth(4);
1125 TF1* MomentumFunctionProton =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"MomentumFunctionProton"));
1127 MomentumFunctionProton->SetRange(0.01, 5.5);
1128 MomentumFunctionProton->SetLineColor(kRed);
1129 MomentumFunctionProton->SetLineWidth(4);
1131 TF1* MomentumFunctionKaon =
static_cast<TF1*
>(BetaGammaFunctionKaon->Clone(
"MomentumFunctionKaon"));
1133 MomentumFunctionKaon->SetRange(0.01, 5.5);
1134 MomentumFunctionKaon->SetLineColor(kRed);
1135 MomentumFunctionKaon->SetLineWidth(4);
1137 gStyle->SetOptFit(1111);
1138 std::unique_ptr<TCanvas> CanvasOverlays(
new TCanvas(
"CanvasOverlays",
"overlays", 1300, 1000));
1139 CanvasOverlays->Divide(2, 2);
1140 CanvasOverlays->cd(1); Electron2DHistogram->Draw(); MomentumFunctionElectron->Draw(
"SAME");
1141 CanvasOverlays->cd(2); Pion2DHistogram->Draw(); MomentumFunctionPion->Draw(
"SAME");
1142 CanvasOverlays->cd(3); Kaon2DHistogram->Draw(); MomentumFunctionKaon->Draw(
"SAME");
1143 CanvasOverlays->cd(4); Proton2DHistogram->Draw(); MomentumFunctionProton->Draw(
"SAME");
1144 CanvasOverlays->Print(
"SVDdEdxOverlaysFitsHistos.pdf");
1146 TF1* MomentumFunctionDeuteron =
static_cast<TF1*
>(BetaGammaFunctionProton->Clone(
"MomentumFunctionDeuteron"));
1148 MomentumFunctionDeuteron->SetRange(0.01, 5.5);
1149 MomentumFunctionDeuteron->SetLineColor(kRed);
1151 TF1* MomentumFunctionMuon =
static_cast<TF1*
>(BetaGammaFunctionPion->Clone(
"MomentumFunctionMuon"));
1153 MomentumFunctionMuon->SetRange(0.01, 5.5);
1154 MomentumFunctionMuon->SetLineColor(kRed);
1158 std::unique_ptr<TCanvas> OverlayAllTracksCanvas(
new TCanvas(
"OverlayAllTracksCanvas",
"The Ultimate Plot", 10, 10, 1000, 700));
1160 TH2F* AllTracksHistogram =
new TH2F(
"AllTracksHistogram",
"AllTracksHistogram;Momentum [GeV/c];dEdx [arb. units]", 1000, 0.05, 5,
1163 ttreeGeneric->Draw(
"TrackSVDdEdx:TrackSVDdEdxTrackMomentum>>AllTracksHistogram",
"TracknSVDHits>7",
"goff");
1164 AllTracksHistogram->Draw(
"COLZ");
1165 AllTracksHistogram->GetXaxis()->SetTitle(
"Momentum [GeV/c]");
1166 AllTracksHistogram->GetYaxis()->SetTitle(
"dE/dx [arbitrary units]");
1167 MomentumFunctionElectron->Draw(
"SAME");
1168 MomentumFunctionMuon->Draw(
"SAME");
1169 MomentumFunctionPion->Draw(
"SAME");
1170 MomentumFunctionKaon->Draw(
"SAME");
1171 MomentumFunctionProton->Draw(
"SAME");
1172 MomentumFunctionDeuteron->Draw(
"SAME");
1173 OverlayAllTracksCanvas->SetLogx();
1174 OverlayAllTracksCanvas->SetLogz();
1176 OverlayAllTracksCanvas->Print(
"SVDdEdxAllTracksWithFits.pdf");
1177 TFile OverlayAllTracksPlotFile(
"SVDdEdxCalibrationOverlayAllTracks.root",
"RECREATE");
1178 AllTracksHistogram->Write();
1179 MomentumFunctionElectron->Write();
1180 MomentumFunctionMuon->Write();
1181 MomentumFunctionPion->Write();
1182 MomentumFunctionKaon->Write();
1183 MomentumFunctionProton->Write();
1184 MomentumFunctionDeuteron->Write();
1185 OverlayAllTracksCanvas->Write();
1186 OverlayAllTracksPlotFile.Close();
1192 double PionRangeMin = 0.6;
1193 double PionRangeMax = 1.;
1194 double KaonRangeMin = 1.9;
1195 double KaonRangeMax = 3;
1196 double ElectronRangeMin = 1.;
1197 double ElectronRangeMax = 1.4;
1199 auto PionResolutionHistogram = Pion2DHistogram->ProjectionY(
"PionResolutionHistogram",
1200 Pion2DHistogram->GetXaxis()->FindBin(PionRangeMin),
1201 Pion2DHistogram->GetXaxis()->FindBin(PionRangeMax));
1202 auto ElectronResolutionHistogram = Electron2DHistogram->ProjectionY(
"ElectronResolutionHistogram",
1203 Electron2DHistogram->GetXaxis()->FindBin(ElectronRangeMin), Electron2DHistogram->GetXaxis()->FindBin(ElectronRangeMax));
1204 auto KaonResolutionHistogram = Kaon2DHistogram->ProjectionY(
"KaonResolutionHistogram",
1205 Kaon2DHistogram->GetXaxis()->FindBin(KaonRangeMin),
1206 Kaon2DHistogram->GetXaxis()->FindBin(KaonRangeMax));
1210 TF1* PionResolutionFunction =
new TF1(
"PionResolutionFunction",
1211 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 100e3, 1500e3);
1216 PionResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1217 PionResolutionFunction->SetParLimits(0, 0, 500);
1218 PionResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1219 PionResolutionFunction->SetParLimits(2, 0, 1);
1220 PionResolutionFunction->SetParLimits(3, 0, 500);
1221 PionResolutionFunction->SetParLimits(4, 0, 7);
1222 PionResolutionFunction->SetParLimits(5, 1, 7);
1223 PionResolutionFunction->SetNpx(1000);
1224 auto FitResultResolutionPion = PionResolutionHistogram->Fit(PionResolutionFunction,
"RSI");
1226 B2INFO(
"relative resolution for pions: " << PionResolutionFunction->GetParameter(2));
1227 B2INFO(
"resolution for pions: fit status" << FitResultResolutionPion->Status());
1229 TF1* KaonResolutionFunction =
new TF1(
"KaonResolutionFunction",
1230 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 100e3, 1500e3);
1233 KaonResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1234 KaonResolutionFunction->SetParLimits(0, 0, 500);
1235 KaonResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1236 KaonResolutionFunction->SetParLimits(2, 0, 1);
1237 KaonResolutionFunction->SetParLimits(3, 0, 500);
1238 KaonResolutionFunction->SetParLimits(4, 0, 7);
1239 KaonResolutionFunction->SetParLimits(5, 1, 7);
1240 KaonResolutionFunction->SetNpx(1000);
1241 auto FitResultResolutionKaon = KaonResolutionHistogram->Fit(KaonResolutionFunction,
"RSI");
1243 B2INFO(
"relative resolution for kaons: " << KaonResolutionFunction->GetParameter(2));
1244 B2INFO(
"resolution for kaons: fit status" << FitResultResolutionKaon->Status());
1246 if ((FitResultResolutionKaon->Status() > 1)
1247 && (FitResultResolutionPion->Status() <= 1)) KaonResolutionFunction =
static_cast<TF1*
>
1248 (PionResolutionFunction->Clone(
"KaonResolutionFunction"));
1253 TF1* ElectronResolutionFunction =
new TF1(
"ElectronResolutionFunction",
1254 "[0]*TMath::Landau(x, [1], [1]*[2])*TMath::Gaus(x, [1], [1]*[2]*[4]) + [3]*TMath::Gaus(x, [1], [1]*[2]*[5])", 50e3, 1500e3);
1257 ElectronResolutionFunction->SetParameters(1, 6.e5, 0.1, 0.5, 2, 1);
1258 ElectronResolutionFunction->SetParLimits(0, 0, 500);
1259 ElectronResolutionFunction->SetParLimits(1, 3.e5, 8.e5);
1260 ElectronResolutionFunction->SetParLimits(2, 0, 1);
1261 ElectronResolutionFunction->SetParLimits(3, 0, 500);
1262 ElectronResolutionFunction->SetParLimits(4, 0, 7);
1263 ElectronResolutionFunction->SetParLimits(5, 1, 7);
1264 ElectronResolutionFunction->SetNpx(1000);
1265 auto FitResultResolutionElectron = ElectronResolutionHistogram->Fit(ElectronResolutionFunction,
"RSI");
1267 B2INFO(
"relative resolution for electrons: " << ElectronResolutionFunction->GetParameter(2));
1268 B2INFO(
"resolution for electrons: fit status" << FitResultResolutionElectron->Status());
1272 TCanvas* CanvasResolutions =
new TCanvas(
"CanvasResolutions",
"Resolutions", 1200, 650);
1273 CanvasResolutions->Divide(3, 1);
1274 CanvasResolutions->cd(1); PionResolutionHistogram->Draw();
1275 CanvasResolutions->cd(2); KaonResolutionHistogram->Draw();
1276 CanvasResolutions->cd(3); ElectronResolutionHistogram->Draw();
1278 CanvasResolutions->Print(
"SVDdEdxResolutions.pdf");
1279 TFile OverlayResolutionsPlotFile(
"SVDdEdxCalibrationResolutions.root",
"RECREATE");
1280 PionResolutionHistogram->Write();
1281 KaonResolutionHistogram->Write();
1282 ElectronResolutionHistogram->Write();
1283 CanvasResolutions->Write();
1284 OverlayResolutionsPlotFile.Close();
1290 double BiasCorrectionPion = PionResolutionFunction->GetParameter(1) - MomentumFunctionPion->Eval((
1291 PionRangeMax + PionRangeMin) / 2.);
1292 B2INFO(
"BiasCorrectionPion = " << BiasCorrectionPion);
1295 TH2F* Pion2DHistogramNew =
PrepareNewHistogram(Pion2DHistogram, Form(
"%sNew", Pion2DHistogram->GetName()), MomentumFunctionPion,
1296 PionResolutionFunction, BiasCorrectionPion);
1299 TH2F* Pion2DHistogramResidual =
static_cast<TH2F*
>(Pion2DHistogram->Clone(
"Pion2DHistogramResidual"));
1300 Pion2DHistogramResidual->Add(Pion2DHistogramNew, Pion2DHistogram, 1, -1);
1301 Pion2DHistogramResidual->SetMinimum(-0.15);
1302 Pion2DHistogramResidual->SetMaximum(0.15);
1305 double BiasCorrectionKaon = KaonResolutionFunction->GetParameter(1) - MomentumFunctionKaon->Eval((
1306 KaonRangeMax + KaonRangeMin) / 2.);
1307 B2INFO(
"BiasCorrectionKaon = " << BiasCorrectionKaon);
1311 double BiasCorrectionProton = KaonResolutionFunction->GetParameter(1) - MomentumFunctionProton->Eval(3.);
1312 B2INFO(
"BiasCorrectionProton = " << BiasCorrectionProton);
1314 if ((BiasCorrectionProton / BiasCorrectionKaon) > 1.5) BiasCorrectionProton =
1318 TH2F* Kaon2DHistogramNew =
PrepareNewHistogram(Kaon2DHistogram, Form(
"%sNew", Kaon2DHistogram->GetName()), MomentumFunctionKaon,
1319 KaonResolutionFunction, BiasCorrectionKaon);
1321 TH2F* Kaon2DHistogramResidual =
static_cast<TH2F*
>(Kaon2DHistogram->Clone(
"Kaon2DHistogramResidual"));
1322 Kaon2DHistogramResidual->Add(Kaon2DHistogramNew, Kaon2DHistogram, 1, -1);
1323 Kaon2DHistogramResidual->SetMinimum(-0.15);
1324 Kaon2DHistogramResidual->SetMaximum(0.15);
1327 TH2F* Proton2DHistogramNew =
PrepareNewHistogram(Proton2DHistogram, Form(
"%sNew", Proton2DHistogram->GetName()),
1328 MomentumFunctionProton,
1329 KaonResolutionFunction, BiasCorrectionProton);
1332 TH2F* Proton2DHistogramResidual =
static_cast<TH2F*
>(Proton2DHistogram->Clone(
"Proton2DHistogramResidual"));
1333 Proton2DHistogramResidual->Add(Proton2DHistogramNew, Proton2DHistogram, 1, -1);
1334 Proton2DHistogramResidual->SetMinimum(-0.15);
1335 Proton2DHistogramResidual->SetMaximum(0.15);
1338 TH2F* Deuteron2DHistogramNew =
PrepareNewHistogram(Proton2DHistogram,
"Deuteron2DHistogramNew", MomentumFunctionDeuteron,
1339 KaonResolutionFunction,
1340 BiasCorrectionKaon);
1341 Deuteron2DHistogramNew->SetTitle(
"hist_d1_1000010020_trunc");
1344 TH2F* Muon2DHistogramNew =
PrepareNewHistogram(Pion2DHistogram,
"Muon2DHistogramNew", MomentumFunctionMuon, PionResolutionFunction,
1345 BiasCorrectionPion);
1346 Muon2DHistogramNew->SetTitle(
"hist_d1_13_trunc");
1349 double BiasCorrectionElectron = ElectronResolutionFunction->GetParameter(1) - MomentumFunctionElectron->Eval((
1350 ElectronRangeMax + ElectronRangeMin) / 2.);
1351 B2INFO(
"BiasCorrectionElectron = " << BiasCorrectionElectron);
1352 TH2F* Electron2DHistogramNew =
PrepareNewHistogram(Electron2DHistogram, Form(
"%sNew", Electron2DHistogram->GetName()),
1353 MomentumFunctionElectron,
1354 ElectronResolutionFunction, BiasCorrectionElectron);
1356 TH2F* Electron2DHistogramResidual =
static_cast<TH2F*
>(Electron2DHistogram->Clone(
"Electron2DHistogramResidual"));
1357 Electron2DHistogramResidual->Add(Electron2DHistogramNew, Electron2DHistogram, 1, -1);
1358 Electron2DHistogramResidual->SetMinimum(-0.15);
1359 Electron2DHistogramResidual->SetMaximum(0.15);
1361 Electron2DHistogramNew->SetName(
"Electron2DHistogramNew");
1362 Muon2DHistogramNew->SetName(
"Muon2DHistogramNew");
1363 Pion2DHistogramNew->SetName(
"Pion2DHistogramNew");
1364 Kaon2DHistogramNew->SetName(
"Kaon2DHistogramNew");
1365 Proton2DHistogramNew->SetName(
"Proton2DHistogramNew");
1366 Deuteron2DHistogramNew->SetName(
"Deuteron2DHistogramNew");
1370 TCanvas* CanvasSummaryGenerated =
new TCanvas(
"CanvasSummaryGenerated",
"Generated payloads", 1700, 850);
1371 CanvasSummaryGenerated->Divide(3, 2);
1372 CanvasSummaryGenerated->cd(1); Electron2DHistogramNew->Draw(
"COLZ");
1373 CanvasSummaryGenerated->cd(2); Muon2DHistogramNew->Draw(
"COLZ");
1374 CanvasSummaryGenerated->cd(3); Pion2DHistogramNew->Draw(
"COLZ");
1375 CanvasSummaryGenerated->cd(4); Kaon2DHistogramNew->Draw(
"COLZ");
1376 CanvasSummaryGenerated->cd(5); Proton2DHistogramNew->Draw(
"COLZ");
1377 CanvasSummaryGenerated->cd(6); Deuteron2DHistogramNew->Draw(
"COLZ");
1379 CanvasSummaryGenerated->Print(
"SVDdEdxGeneratedPayloads.pdf");
1380 TFile SummaryGeneratedPlotFile(
"SVDdEdxCalibrationSummaryGenerated.root",
"RECREATE");
1381 Electron2DHistogramNew->Write();
1382 Muon2DHistogramNew->Write();
1383 Pion2DHistogramNew->Write();
1384 Kaon2DHistogramNew->Write();
1385 Proton2DHistogramNew->Write();
1386 Deuteron2DHistogramNew->Write();
1387 SummaryGeneratedPlotFile.Close();
1390 TCanvas* CanvasSummaryData =
new TCanvas(
"CanvasSummaryData",
"Data distributions", 1700, 850);
1391 CanvasSummaryData->Divide(3, 2);
1392 CanvasSummaryData->cd(1); Electron2DHistogram->Draw(
"COLZ");
1393 CanvasSummaryData->cd(3); Pion2DHistogram->Draw(
"COLZ");
1394 CanvasSummaryData->cd(4); Kaon2DHistogram->Draw(
"COLZ");
1395 CanvasSummaryData->cd(5); Proton2DHistogram->Draw(
"COLZ");
1397 CanvasSummaryData->Print(
"SVDdEdxDataDistributions.pdf");
1398 TFile SummaryDataPlotFile(
"SVDdEdxCalibrationSummaryData.root",
"RECREATE");
1399 Electron2DHistogram->Write();
1400 Pion2DHistogram->Write();
1401 Kaon2DHistogram->Write();
1402 Proton2DHistogram->Write();
1403 SummaryDataPlotFile.Close();
1406 TCanvas* CanvasSummaryResiduals =
new TCanvas(
"CanvasSummaryResiduals",
"Residuals", 1700, 850);
1407 CanvasSummaryResiduals->Divide(3, 2);
1408 CanvasSummaryResiduals->cd(1); Electron2DHistogramResidual->Draw(
"COLZ");
1409 CanvasSummaryResiduals->cd(3); Pion2DHistogramResidual->Draw(
"COLZ");
1410 CanvasSummaryResiduals->cd(4); Kaon2DHistogramResidual->Draw(
"COLZ");
1411 CanvasSummaryResiduals->cd(5); Proton2DHistogramResidual->Draw(
"COLZ");
1414 CanvasSummaryResiduals->Print(
"SVDdEdxResiduals.pdf");
1415 TFile SummaryResidualsPlotFile(
"SVDdEdxCalibrationSummaryResiduals.root",
"RECREATE");
1416 Electron2DHistogramResidual->Write();
1417 Pion2DHistogramResidual->Write();
1418 Kaon2DHistogramResidual->Write();
1419 Proton2DHistogramResidual->Write();
1420 SummaryResidualsPlotFile.Close();
1425 std::unique_ptr<TList> histList(
new TList);
1426 histList->Add(Electron2DHistogramNew);
1427 histList->Add(Muon2DHistogramNew);
1428 histList->Add(Pion2DHistogramNew);
1429 histList->Add(Kaon2DHistogramNew);
1430 histList->Add(Proton2DHistogramNew);
1431 histList->Add(Deuteron2DHistogramNew);