|
@@ -0,0 +1,271 @@
|
|
|
|
+#include <iostream>
|
|
|
|
+#include <TFile.h>
|
|
|
|
+#include <TF2.h>
|
|
|
|
+#include <TH2F.h>
|
|
|
|
+#include <TMath.h>
|
|
|
|
+
|
|
|
|
+const int NptBins = 24;
|
|
|
|
+
|
|
|
|
+const double pionMassSqr = TMath::Power(0.13957061, 2);
|
|
|
|
+const double kaonMassSqr = TMath::Power(0.493677, 2);
|
|
|
|
+const double protMassSqr = TMath::Power(0.938272081, 2);
|
|
|
|
+
|
|
|
|
+void Fit2Dgaus(const Char_t *inFileName, const Char_t *outFileName)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+ const double ptBin[NptBins + 1] = {0., 0.2, 0.4, 0.6, 0.8, 1., 1.2, 1.4, 1.6, 1.8, 2., 2.2, 2.4, 2.6, 2.8, 3., 3.2, 3.4, 3.6, 3.8, 4., 4.5, 5., 5.5, 6.};
|
|
|
|
+
|
|
|
|
+ const double pionNsigMean[NptBins] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
|
|
|
|
+ const double kaonNsigMean[NptBins] = {12., 6., 3., 1., -0.3, -1., -1.2, -1.5, -1.5, -1.5, -1.7, -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2., -2.};
|
|
|
|
+ const double protNsigMean[NptBins] = {22., 15., 9., 5., 3., 1.5, 0.2, -0.5, -1., -1.5, -1.8, -2., -2.2, -2.2, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5, -2.5};
|
|
|
|
+
|
|
|
|
+ const double pionNsigWidth[NptBins] = {4., 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5};
|
|
|
|
+ const double kaonNsigWidth[NptBins] = {8., 5., 4., 4., 3.7, 3., 3., 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5};
|
|
|
|
+ const double protNsigWidth[NptBins] = {8., 10., 7., 5., 4., 3.5, 3., 2.6, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5};
|
|
|
|
+
|
|
|
|
+ const std::pair<double,double> pionMsqrRange [NptBins] = {{-0.039,0.078},{-0.039,0.078},{-0.039,0.078},{-0.039,0.078},
|
|
|
|
+ {-0.039,0.078},{-0.039,0.078},{-0.039,0.078},{-0.1,0.14},
|
|
|
|
+ {-0.039,0.078},{-0.039,0.078},{-0.039,0.078},{-0.036,0.019},
|
|
|
|
+ {-0.039,0.078},{-0.039,0.078},{-0.039,0.078},{-0.039,0.078},
|
|
|
|
+ {-0.039,0.078},{-0.039,0.078},{-0.039,0.078},{-0.039,0.078},
|
|
|
|
+ {-0.039,0.078},{-0.039,0.078},{-0.039,0.078},{-0.039,0.078}};
|
|
|
|
+
|
|
|
|
+ const std::pair<double,double> kaonMsqrRange [NptBins] = {{0.098,0.38},{0.098,0.38},{0.098,0.38},{0.098,0.38},
|
|
|
|
+ {0.098,0.38},{0.098,0.38},{0.098,0.38},{0.13,0.4},
|
|
|
|
+ {0.098,0.38},{0.098,0.38},{0.098,0.38},{0.098,0.38},
|
|
|
|
+ {0.098,0.38},{0.098,0.38},{0.098,0.38},{0.098,0.38},
|
|
|
|
+ {0.098,0.38},{0.098,0.38},{0.098,0.38},{0.098,0.38},
|
|
|
|
+ {0.098,0.38},{0.098,0.38},{0.098,0.38},{0.098,0.38}};
|
|
|
|
+
|
|
|
|
+ const std::pair<double,double> protMsqrRange [NptBins] = {{0.35,1.4},{0.35,1.4},{0.35,1.4},{0.35,1.4},
|
|
|
|
+ {0.35,1.4},{0.35,1.4},{0.35,1.4},{0.35,1.4},
|
|
|
|
+ {0.35,1.4},{0.35,1.4},{0.35,1.4},{0.35,1.4},
|
|
|
|
+ {0.35,1.4},{0.35,1.4},{0.35,1.4},{0.35,1.4},
|
|
|
|
+ {0.35,1.4},{0.35,1.4},{0.35,1.4},{0.35,1.4},
|
|
|
|
+ {0.35,1.4},{0.35,1.4},{0.35,1.4},{0.35,1.4}};
|
|
|
|
+
|
|
|
|
+ const std::pair<double,double> tripleNsigRange [NptBins] = {{-6., 28.},{-6., 28.},{-6., 28.},{-6., 28.},
|
|
|
|
+ {-6., 28.},{-6., 28.},{-6., 28.},{-5., 4.},
|
|
|
|
+ {-5., 4.},{-6., 28.},{-6., 28.},{-5., 3.},
|
|
|
|
+ {-5., 3.},{-5., 3.},{-5., 3.},{-5., 3.},
|
|
|
|
+ {-5., 3.},{-5., 3.},{-5., 3.},{-5., 3.},
|
|
|
|
+ {-5., 2.},{-4.5, 2.},{-4., 2.},{-4., 2.}};
|
|
|
|
+
|
|
|
|
+ const std::pair<double,double> tripleMsqrRange [NptBins] = {{-0.5,1.5},{-0.5,1.5},{-0.5,1.5},{-0.5,1.5},
|
|
|
|
+ {-0.5,1.5},{-0.5,1.5},{-0.5,1.5},{-0.4,1.1},
|
|
|
|
+ {-0.3,1.3},{-0.5,1.5},{-0.5,1.5},{-0.5,1.5},
|
|
|
|
+ {-0.5,1.5},{-0.5,1.5},{-0.5,1.5},{-0.5,1.5},
|
|
|
|
+ {-0.5,1.5},{-0.5,1.5},{-0.5,1.5},{-0.5,1.5},
|
|
|
|
+ {-0.5,1.5},{-0.5,1.5},{-0.5,1.5},{-0.5,1.5}};
|
|
|
|
+
|
|
|
|
+ TFile *fi = new TFile(inFileName, "read");
|
|
|
|
+
|
|
|
|
+ TH2F *hNsigMsqr[NptBins];
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hNsigMsqr[i] = (TH2F *)fi->Get(Form("hNsigPionMSqr%i", i));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ TF2 *gausPion[NptBins];
|
|
|
|
+ TF2 *gausKaon[NptBins];
|
|
|
|
+ TF2 *gausProton[NptBins];
|
|
|
|
+ TF2 *gausTriple[NptBins];
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ gausPion[i] = new TF2(Form("gausPion%i", i), "xygaus", pionNsigMean[i] - pionNsigWidth[i], pionNsigMean[i] + pionNsigWidth[i], pionMsqrRange[i].first, pionMsqrRange[i].second);
|
|
|
|
+ gausKaon[i] = new TF2(Form("gausKaon%i", i), "xygaus", kaonNsigMean[i] - kaonNsigWidth[i], kaonNsigMean[i] + kaonNsigWidth[i], kaonMsqrRange[i].first, kaonMsqrRange[i].second);
|
|
|
|
+ gausProton[i] = new TF2(Form("gausProton%i", i), "xygaus", protNsigMean[i] - protNsigWidth[i], protNsigMean[i] + protNsigWidth[i], protMsqrRange[i].first, protMsqrRange[i].second);
|
|
|
|
+ gausTriple[i] = new TF2(Form("gausTriple%i", i), "xygaus(0)+xygaus(5)+xygaus(10)", tripleNsigRange[i].first, tripleNsigRange[i].second, tripleMsqrRange[i].first, tripleMsqrRange[i].second);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // gausPion[0] = new TF2(Form("gausPion%i",0),"xygaus",-3.,3.,0.,0.4);
|
|
|
|
+ // gausKaon[0] = new TF2(Form("gausKaon%i",0),"xygaus",4.,20.,0.2,0.28);
|
|
|
|
+ // gausProton[0] = new TF2(Form("gausProton%i",0),"xygaus",6.8,32.85,0.54,1.25);
|
|
|
|
+ // gausProton[0]->SetParameters(7.97,20.85,0.888,0.04366);
|
|
|
|
+ // gausTriple[0] = new TF2(Form("gausTriple%i",0),"xygaus(0)+xygaus(5)+xygaus(10)",-5.,32.85,-0.5,2.);
|
|
|
|
+
|
|
|
|
+ int TestStop = 4;
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hNsigMsqr[i]->Fit(gausPion[i], "R0");
|
|
|
|
+ hNsigMsqr[i]->Fit(gausKaon[i], "R0");
|
|
|
|
+ hNsigMsqr[i]->Fit(gausProton[i], "R0");
|
|
|
|
+
|
|
|
|
+ Double_t par[15];
|
|
|
|
+ gausPion[i]->GetParameters(&par[0]);
|
|
|
|
+ gausKaon[i]->GetParameters(&par[5]);
|
|
|
|
+ gausProton[i]->GetParameters(&par[10]);
|
|
|
|
+ gausTriple[i]->SetParameters(par);
|
|
|
|
+
|
|
|
|
+ std::cout << "Fit plot: " << i << std::endl;
|
|
|
|
+ hNsigMsqr[i]->Fit(gausTriple[i], "R");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ TFile *fo = new TFile(outFileName, "recreate");
|
|
|
|
+ fo->cd();
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hNsigMsqr[i]->Write();
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ gausPion[i]->Write();
|
|
|
|
+ gausKaon[i]->Write();
|
|
|
|
+ gausProton[i]->Write();
|
|
|
|
+ }
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ gausTriple[i]->Write();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Fit1DgausMassSqr(const Char_t *inFileName, const Char_t *outFileName)
|
|
|
|
+{
|
|
|
|
+ TFile *fi = new TFile(inFileName, "read");
|
|
|
|
+
|
|
|
|
+ TH2F *hNsigMsqrPion[NptBins];
|
|
|
|
+ TH2F *hNsigMsqrKaon[NptBins];
|
|
|
|
+ TH2F *hNsigMsqrProton[NptBins];
|
|
|
|
+
|
|
|
|
+ TH1F *hMsqrPion[NptBins];
|
|
|
|
+ TH1F *hMsqrKaon[NptBins];
|
|
|
|
+ TH1F *hMsqrProton[NptBins];
|
|
|
|
+
|
|
|
|
+ TF1 *gausPion[NptBins];
|
|
|
|
+ TF1 *gausKaon[NptBins];
|
|
|
|
+ TF1 *gausProton[NptBins];
|
|
|
|
+
|
|
|
|
+ TF1 *gausTriplePion[NptBins];
|
|
|
|
+ TF1 *gausTripleKaon[NptBins];
|
|
|
|
+ TF1 *gausTripleProton[NptBins];
|
|
|
|
+
|
|
|
|
+ TH1F *hMsqrSigmaPion = new TH1F("hMsqrSigmaPion","hMsqrSigmaPion",NptBins,0.15,6.15);
|
|
|
|
+ TH1F *hMsqrSigmaKaon = new TH1F("hMsqrSigmaKaon","hMsqrSigmaKaon",NptBins,0.15,6.15);
|
|
|
|
+ TH1F *hMsqrSigmaProton = new TH1F("hMsqrSigmaProton","hMsqrSigmaProton",NptBins,0.15,6.15);
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hNsigMsqrPion[i] = (TH2F *)fi->Get(Form("hNsigPionMSqr%i", i));
|
|
|
|
+ hNsigMsqrKaon[i] = (TH2F *)fi->Get(Form("hNsigKaonMSqr%i", i));
|
|
|
|
+ hNsigMsqrProton[i] = (TH2F *)fi->Get(Form("hNsigProtonMSqr%i", i));
|
|
|
|
+
|
|
|
|
+ gausPion[i] = new TF1(Form("gausPion%i",i),"gaus",pionMassSqr*0.,pionMassSqr*2.);
|
|
|
|
+ gausKaon[i] = new TF1(Form("gausKaon%i",i),"gaus",kaonMassSqr*0.5,kaonMassSqr*1.5);
|
|
|
|
+ gausProton[i] = new TF1(Form("gausProton%i",i),"gaus",protMassSqr*0.5,protMassSqr*1.5);
|
|
|
|
+
|
|
|
|
+ gausTriplePion[i] = new TF1(Form("gausTriplePion%i",i),"gaus(0)+gaus(3)+gaus(6)",-0.5,1.5);
|
|
|
|
+ gausTripleKaon[i] = new TF1(Form("gausTripleKaon%i",i),"gaus(0)+gaus(3)+gaus(6)",-0.5,1.5);
|
|
|
|
+ gausTripleProton[i] = new TF1(Form("gausTripleProton%i",i),"gaus(0)+gaus(3)+gaus(6)",-0.5,1.5);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int bin1 = 0, bin2 = 0;
|
|
|
|
+ Double_t parPion[9], parKaon[9], parProton[9];
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ bin1 = 651; //hNsigMsqrPion[i]->FindBin(-2.5);
|
|
|
|
+ bin2 = 750; //hNsigMsqrPion[i]->FindBin(2.5);
|
|
|
|
+ hMsqrPion[i] = (TH1F*) hNsigMsqrPion[i]->ProjectionY(Form("hMsqrPion%i",i),bin1,bin2);
|
|
|
|
+ hMsqrKaon[i] = (TH1F*) hNsigMsqrKaon[i]->ProjectionY(Form("hMsqrKaon%i",i),bin1,bin2);
|
|
|
|
+ hMsqrProton[i] = (TH1F*) hNsigMsqrProton[i]->ProjectionY(Form("hMsqrProton%i",i),bin1,bin2);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //Pion
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hMsqrPion[i]->Fit(gausPion[i],"RQ0");
|
|
|
|
+ hMsqrPion[i]->Fit(gausKaon[i],"RQ0");
|
|
|
|
+ hMsqrPion[i]->Fit(gausProton[i],"RQ0");
|
|
|
|
+
|
|
|
|
+ gausPion[i]->GetParameters(&parPion[0]);
|
|
|
|
+ gausKaon[i]->GetParameters(&parPion[3]);
|
|
|
|
+ gausProton[i]->GetParameters(&parPion[6]);
|
|
|
|
+
|
|
|
|
+ gausTriplePion[i]->SetParameters(parPion);
|
|
|
|
+
|
|
|
|
+ hMsqrPion[i]->Fit(gausTriplePion[i],"R");
|
|
|
|
+ hMsqrSigmaPion->SetBinContent(i,gausTriplePion[i]->GetParameter(2));
|
|
|
|
+ hMsqrSigmaPion->SetBinError(i,gausTriplePion[i]->GetParError(2));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //Kaon
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hMsqrKaon[i]->Fit(gausPion[i],"RQ0");
|
|
|
|
+ hMsqrKaon[i]->Fit(gausKaon[i],"RQ0");
|
|
|
|
+ hMsqrKaon[i]->Fit(gausProton[i],"RQ0");
|
|
|
|
+
|
|
|
|
+ gausPion[i]->GetParameters(&parKaon[0]);
|
|
|
|
+ gausKaon[i]->GetParameters(&parKaon[3]);
|
|
|
|
+ gausProton[i]->GetParameters(&parKaon[6]);
|
|
|
|
+
|
|
|
|
+ gausTripleKaon[i]->SetParameters(parKaon);
|
|
|
|
+
|
|
|
|
+ hMsqrKaon[i]->Fit(gausTripleKaon[i],"R");
|
|
|
|
+ hMsqrSigmaKaon->SetBinContent(i,gausTripleKaon[i]->GetParameter(5));
|
|
|
|
+ hMsqrSigmaKaon->SetBinError(i,gausTripleKaon[i]->GetParError(5));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //Proton
|
|
|
|
+ for (int i = 0; i < NptBins; i++)
|
|
|
|
+ {
|
|
|
|
+ hMsqrProton[i]->Fit(gausPion[i],"RQ0");
|
|
|
|
+ hMsqrProton[i]->Fit(gausKaon[i],"RQ0");
|
|
|
|
+ hMsqrProton[i]->Fit(gausProton[i],"RQ0");
|
|
|
|
+
|
|
|
|
+ gausPion[i]->GetParameters(&parProton[0]);
|
|
|
|
+ gausKaon[i]->GetParameters(&parProton[3]);
|
|
|
|
+ gausProton[i]->GetParameters(&parProton[6]);
|
|
|
|
+
|
|
|
|
+ gausTripleProton[i]->SetParameters(parProton);
|
|
|
|
+
|
|
|
|
+ hMsqrProton[i]->Fit(gausTripleProton[i],"R");
|
|
|
|
+ hMsqrSigmaProton->SetBinContent(i,gausTripleProton[i]->GetParameter(8));
|
|
|
|
+ hMsqrSigmaProton->SetBinError(i,gausTripleProton[i]->GetParError(8));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ TF1 *polPion = new TF1("polPion","pol8",0.15,4.9);
|
|
|
|
+ TF1 *polKaon = new TF1("polKaon","pol8",0.15,4.9);
|
|
|
|
+ TF1 *polProton = new TF1("polProton","pol8",0.15,4.9);
|
|
|
|
+
|
|
|
|
+ hMsqrSigmaPion->Fit(polPion,"R");
|
|
|
|
+ hMsqrSigmaKaon->Fit(polKaon,"R");
|
|
|
|
+ hMsqrSigmaProton->Fit(polProton,"R");
|
|
|
|
+
|
|
|
|
+ TFile *fo = new TFile(outFileName, "recreate");
|
|
|
|
+ fo->cd();
|
|
|
|
+ // for (int i = 0; i < NptBins; i++)
|
|
|
|
+ // {
|
|
|
|
+ // hMsqrPion[i]->Write();
|
|
|
|
+ // hMsqrKaon[i]->Write();
|
|
|
|
+ // hMsqrProton[i]->Write();
|
|
|
|
+ // }
|
|
|
|
+ // for (int i = 0; i < NptBins; i++)
|
|
|
|
+ // {
|
|
|
|
+ // gausTriplePion[i]->Write();
|
|
|
|
+ // gausTripleKaon[i]->Write();
|
|
|
|
+ // gausTripleProton[i]->Write();
|
|
|
|
+ // }
|
|
|
|
+ hMsqrSigmaPion->Write();
|
|
|
|
+ hMsqrSigmaKaon->Write();
|
|
|
|
+ hMsqrSigmaProton->Write();
|
|
|
|
+
|
|
|
|
+ polPion->Write();
|
|
|
|
+ polKaon->Write();
|
|
|
|
+ polProton->Write();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void CalcPID(const Char_t *inFileName, const Char_t *outFileName, const Int_t mode)
|
|
|
|
+{
|
|
|
|
+ if (mode==0)
|
|
|
|
+ {
|
|
|
|
+ Fit2Dgaus(inFileName, outFileName);
|
|
|
|
+ }
|
|
|
|
+ if (mode==1)
|
|
|
|
+ {
|
|
|
|
+ Fit1DgausMassSqr(inFileName, outFileName);
|
|
|
|
+ }
|
|
|
|
+}
|