Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-07-16 08:11:23

0001 #include <algorithm>
0002 
0003 float lower_bin_bounds_pion[] = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.8, 2.1, 2.4, 2.7, 3, 4};
0004 const unsigned int n_variable_bins_pion = sizeof(lower_bin_bounds_pion)/sizeof(lower_bin_bounds_pion[0]) - 1; 
0005 float lower_bin_bounds[] = {0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
0006 const unsigned int n_variable_bins = sizeof(lower_bin_bounds)/sizeof(lower_bin_bounds[0]) - 1; 
0007 
0008 float min_track_pT_proton = 1.0;
0009 float min_track_pT_kaon = 0.75;
0010 int nBins_eta = 50;
0011 int nBins_phi = 20;
0012 int nBins_pT = 20;
0013 float eta_max = 1.2;
0014 float phi_max = M_PI;
0015 
0016 string plotPath = "plots_negative_track_to_positive_track_with_DCA/";
0017 //string plotPath = "plots_negative_track_to_positive_track/";
0018 string makeDirectory = "mkdir -p " + plotPath;
0019 system(makeDirectory.c_str());
0020 
0021 template <typename T>
0022 string to_string_with_precision(const T a_value, const int n = 0)
0023 {
0024   ostringstream out;
0025   out.precision(n);
0026   out << fixed << a_value;
0027   return out.str();
0028 }
0029 
0030 //Initialise histograms
0031 TH1F makeHisto(int nBins, float min, float max, string xAxisTitle, string unit, string yAxisTitle)
0032 {
0033   TH1F myHisto(yAxisTitle.c_str(), yAxisTitle.c_str(), nBins, min, max);
0034   if (unit != "") xAxisTitle += " [" + unit +  "]";
0035   myHisto.GetXaxis()->SetTitle(xAxisTitle.c_str());
0036   myHisto.GetYaxis()->SetTitle(yAxisTitle.c_str());
0037   
0038   return myHisto;
0039 }
0040 
0041 TH1F makeHisto(int nBins, float* min, string xAxisTitle, string unit, string yAxisTitle = "Raw Ratio")
0042 {
0043   TH1F myHisto(xAxisTitle.c_str(), xAxisTitle.c_str(), nBins, min);
0044 
0045   if (unit != "") xAxisTitle += " [" + unit +  "]";
0046   myHisto.GetXaxis()->SetTitle(xAxisTitle.c_str());
0047   myHisto.GetYaxis()->SetTitle(yAxisTitle.c_str());
0048 
0049   return myHisto;
0050 }
0051 
0052 TH1F pT_proton_histo = makeHisto(nBins_pT, 0, min_track_pT_proton, "p_{T}", "GeV", "p Yield");
0053 TH1F pT_antiproton_histo = makeHisto(nBins_pT, 0, min_track_pT_proton, "p_{T}", "GeV", "#bar{p} Yield");
0054 TH1F pT_proton_ratio = makeHisto(nBins_pT, 0, min_track_pT_proton, "p_{T}", "GeV", "#bar{p}/p Raw Ratio");
0055 TH1F pT_piplus_histo = makeHisto(nBins_pT, 0, 4, "p_{T}", "GeV", "#pi^{+} Yield");
0056 TH1F pT_piminus_histo = makeHisto(nBins_pT, 0, 4, "p_{T}", "GeV", "#pi^{-} Yield");
0057 TH1F pT_pion_ratio = makeHisto(nBins_pT, 0, 4, "p_{T}", "GeV", "#pi^{-}/#pi^{+} Raw Ratio");
0058 TH1F pT_Kplus_histo = makeHisto(nBins_pT, 0, min_track_pT_kaon, "p_{T}", "GeV", "K^{+} Yield");
0059 TH1F pT_Kminus_histo = makeHisto(nBins_pT, 0, min_track_pT_kaon, "p_{T}", "GeV", "K^{-} Yield");
0060 TH1F pT_Kaon_ratio = makeHisto(nBins_pT, 0, min_track_pT_kaon, "p_{T}", "GeV", "K^{-}/K^{+} Raw Ratio");
0061 TH1F eta_proton_histo = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "p Yield");
0062 TH1F eta_antiproton_histo = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "#bar{p} Yield");
0063 TH1F eta_proton_ratio = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "#bar{p}/p Raw Ratio");
0064 TH1F eta_piplus_histo = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "#pi^{+} Yield");
0065 TH1F eta_piminus_histo = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "#pi^{-} Yield");
0066 TH1F eta_pion_ratio = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "#pi^{-}/#pi^{+} Raw Ratio");
0067 TH1F eta_Kplus_histo = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "K^{+} Yield");
0068 TH1F eta_Kminus_histo = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "K^{-} Yield");
0069 TH1F eta_Kaon_ratio = makeHisto(nBins_eta, -1*eta_max, eta_max, "#eta", "", "K^{-}/K^{+} Raw Ratio");
0070 TH1F phi_proton_histo = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "p Yield");
0071 TH1F phi_antiproton_histo = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "#bar{p} Yield");
0072 TH1F phi_proton_ratio = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "#bar{p}/p Raw Ratio");
0073 TH1F phi_piplus_histo = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "#pi^{+} Yield");
0074 TH1F phi_piminus_histo = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "#pi^{-} Yield");
0075 TH1F phi_pion_ratio = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "#pi^{-}/#pi^{+} Raw Ratio");
0076 TH1F phi_Kplus_histo = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "K^{+} Yield");
0077 TH1F phi_Kminus_histo = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "K^{-} Yield");
0078 TH1F phi_Kaon_ratio = makeHisto(nBins_phi, -1*phi_max, phi_max, "#phi", "", "K^{-}/K^{+} Raw Ratio");
0079 
0080 template <typename T>
0081 void savePlots(T myPlot, string plotName)
0082 {
0083   TGaxis::SetMaxDigits(3);
0084 
0085   TCanvas *c1  = new TCanvas("myCanvas", "myCanvas",800,800);
0086 
0087   myPlot.GetXaxis()->SetNdivisions(505);
0088   myPlot.GetYaxis()->SetRangeUser(0, myPlot.GetMaximum()*1.2);
0089   //myPlot.Sumw2();
0090   myPlot.Draw("PE1");
0091 
0092   TPaveText *pt;
0093   pt = new TPaveText(0.15,0.84,0.95,0.89, "NDC");
0094   pt->SetFillColor(0);
0095   pt->SetFillStyle(0);
0096   pt->SetTextFont(42);
0097   TText *pt_LaTex;
0098   pt->AddText("#it{#bf{sPHENIX}} Internal, #sqrt{s} = 200 GeV, pp");
0099   pt->SetBorderSize(0);
0100   pt->Draw();
0101   gPad->Modified();
0102 
0103   string extensions[] = {".C", ".pdf", ".png"};
0104   for (auto extension : extensions)
0105   {
0106     string output = plotPath + plotName + extension;
0107     c1->SaveAs(output.c_str());
0108   }
0109 }
0110 
0111 template <typename T>
0112 void saveManyPlots(vector<T> myPlot, string plotName, bool logY = false, vector<string> legendText = {""})
0113 {
0114   TCanvas *c1  = new TCanvas("myCanvas", "myCanvas",800,800);
0115 
0116   if (logY) gPad->SetLogy();
0117 
0118   int colors[] = {4, 2, 6, 1, 3, 6, 7, 8, 9};
0119   Size_t markerStyle[] = {8, 21, 33, 34};
0120   Size_t markerSize = 1;
0121 
0122   float legendYpos[2] = {0.65, 0.85};
0123   float legendTextSize = ((legendYpos[1] - legendYpos[0])/(1.6*myPlot.size()));
0124   TLegend *legend = new TLegend(0.65,legendYpos[0],0.80, legendYpos[1]);
0125   legend->SetTextFont(42);
0126 
0127   for (unsigned int i = 0; i < myPlot.size(); ++i)
0128   {
0129     float transparency = 1;
0130     myPlot[i].SetFillColorAlpha(colors[i], transparency);
0131     myPlot[i].SetLineColor(colors[i]);
0132     myPlot[i].SetMarkerColorAlpha(colors[i], transparency);
0133     myPlot[i].SetMarkerSize(markerSize);
0134     myPlot[i].SetMarkerStyle(markerStyle[i]);
0135     if (legendText.size() < 2) legend->AddEntry(&myPlot[i], myPlot[i].GetXaxis()->GetTitle(), "PL");
0136     else legend->AddEntry(&myPlot[i], legendText[i].c_str(), "PL");
0137   }
0138 
0139   myPlot[0].GetXaxis()->SetNdivisions(505);
0140   float min = std::max(myPlot[0].GetMinimum(), 1.);
0141   myPlot[0].SetMinimum(min*0.8);
0142   float max = logY ? myPlot[0].GetMaximum()*1e3 : myPlot[0].GetMaximum()*1.2;
0143   myPlot[0].SetMaximum(max);
0144   if (strncmp(typeid(myPlot[0]).name(), "4TH2F", 5) == 0)
0145   {
0146     myPlot[0].Draw();
0147     for (unsigned int i = 0; i < myPlot.size(); ++i) myPlot[i].Draw("SAME");
0148   }
0149   else
0150   {
0151     myPlot[0].Draw("PE1");
0152     for (unsigned int i = 0; i < myPlot.size(); ++i) myPlot[i].Draw("PE1SAME");
0153   }
0154 
0155   TPaveText *pt;
0156   pt = new TPaveText(0.15,0.84,0.95,0.89, "NDC");
0157   pt->SetFillColor(0);
0158   pt->SetFillStyle(0);
0159   pt->SetTextFont(42);
0160   TText *pt_LaTex;
0161   pt->AddText("#it{#bf{sPHENIX}} Internal, #sqrt{s} = 200 GeV, pp");
0162   pt->SetBorderSize(0);
0163   pt->Draw();
0164 
0165   legend->SetFillColor(0);
0166   legend->SetFillStyle(0);
0167   legend->SetBorderSize(0);
0168   legend->Draw();
0169 
0170   gPad->Modified();
0171 
0172   string extensions[] = {".C", ".pdf", ".png"};
0173   for (auto extension : extensions)
0174   {
0175     string output = plotPath + "/" + plotName + extension;
0176     c1->SaveAs(output.c_str());
0177   }
0178 }
0179 bool isInRange(float min, float value, float max)
0180 {
0181   return min <= value && value <= max;
0182 }
0183 
0184 void processData()
0185 {
0186   string fileName = "/gpfs/mnt/gpfs02/sphenix/user/cdean/software/TrackingAnalysis/Physics_Val_TF/data/macro/evalFile_00079516_withDCA.root";
0187 
0188   TFile *file = new TFile(fileName.c_str());
0189   TNtuple* data = (TNtuple*)file->Get("ntp_track");
0190 
0191   float track_eta;                  data->SetBranchAddress("eta", &track_eta);
0192   float track_phi;                  data->SetBranchAddress("phi", &track_phi);
0193   float track_pT;                   data->SetBranchAddress("pt", &track_pT);
0194   float track_charge;               data->SetBranchAddress("charge", &track_charge);
0195   float track_nmaps;                data->SetBranchAddress("nmaps", &track_nmaps);
0196   float track_dedx;                 data->SetBranchAddress("dedx", &track_dedx);
0197   float track_expected_proton_dedx; data->SetBranchAddress("prdedx", &track_expected_proton_dedx);
0198   float track_expected_pion_dedx;   data->SetBranchAddress("pidedx", &track_expected_pion_dedx);
0199   float track_expected_kaon_dedx;   data->SetBranchAddress("kdedx", &track_expected_kaon_dedx);
0200   float track_dca3dxy;              data->SetBranchAddress("dca3dxy", &track_dca3dxy);
0201 
0202   int tmp = 0;
0203   int barWidth = 50;
0204   uint64_t nEntries = data->GetEntries();
0205 
0206   for (uint64_t i = 0; i < nEntries; i++)
0207   {
0208      if (tmp != (int)100*i/nEntries)
0209     {
0210       tmp = (int)100*i/nEntries;
0211       if ((tmp%1)  == 0)
0212       {
0213         cout << "[";
0214         int pos = barWidth * tmp/100;
0215         for (int k = 0; k < barWidth; ++k)
0216         {
0217           if (k < pos) cout << "=";
0218           else if (k == pos) cout << ">";
0219           else cout << " ";
0220         }
0221         cout << "] " << tmp << " %\r";
0222         cout.flush();
0223       }
0224     }
0225 
0226     data->GetEntry(i);
0227 
0228     if (track_nmaps < 2) continue;
0229     if (abs(track_dca3dxy) > 0.1) continue;
0230 
0231     bool accept_proton = isInRange(0.4,  track_dedx/track_expected_proton_dedx, 1.8);
0232     bool accept_pion =   isInRange(0.01, track_dedx/track_expected_pion_dedx,   1.2);
0233     bool accept_kaon =   isInRange(0.2,  track_dedx/track_expected_kaon_dedx,   1.8);
0234 
0235     if (track_charge > 0) //Positive tracks
0236     {
0237       if (accept_proton && track_pT <= min_track_pT_proton)
0238       { 
0239         pT_proton_histo.Fill(track_pT);
0240         eta_proton_histo.Fill(track_eta);
0241         phi_proton_histo.Fill(track_phi);
0242       }
0243       if (accept_pion)
0244       { 
0245         pT_piplus_histo.Fill(track_pT);
0246         eta_piplus_histo.Fill(track_eta);
0247         phi_piplus_histo.Fill(track_phi);
0248       }
0249       if (accept_kaon && track_pT <= min_track_pT_kaon)
0250       { 
0251         pT_Kplus_histo.Fill(track_pT);
0252         eta_Kplus_histo.Fill(track_eta);
0253         phi_Kplus_histo.Fill(track_phi);
0254       }
0255     }
0256     else
0257     {
0258       if (accept_proton && track_pT <= min_track_pT_proton)
0259       { 
0260         pT_antiproton_histo.Fill(track_pT);
0261         eta_antiproton_histo.Fill(track_eta);
0262         phi_antiproton_histo.Fill(track_phi);
0263         pT_proton_ratio.Fill(track_pT);
0264         eta_proton_ratio.Fill(track_eta);
0265         phi_proton_ratio.Fill(track_phi);
0266       }
0267       if (accept_pion)
0268       { 
0269         pT_piminus_histo.Fill(track_pT);
0270         eta_piminus_histo.Fill(track_eta);
0271         phi_piminus_histo.Fill(track_phi);
0272         pT_pion_ratio.Fill(track_pT);
0273         eta_pion_ratio.Fill(track_eta);
0274         phi_pion_ratio.Fill(track_phi);
0275       }
0276       if (accept_kaon && track_pT <= min_track_pT_kaon)
0277       { 
0278         pT_Kminus_histo.Fill(track_pT);
0279         eta_Kminus_histo.Fill(track_eta);
0280         phi_Kminus_histo.Fill(track_phi);
0281         pT_Kaon_ratio.Fill(track_pT);
0282         eta_Kaon_ratio.Fill(track_eta);
0283         phi_Kaon_ratio.Fill(track_phi);
0284       }
0285     }
0286   }
0287 
0288   cout << "[";
0289   int pos = barWidth * tmp;
0290   for (int i = 0; i < barWidth; ++i)
0291   {
0292     if (i < pos) cout << "=";
0293     else if (i == pos) cout << ">";
0294     else cout << " ";
0295   }
0296   cout << "] 100 %\r";
0297   cout.flush();
0298   cout<<endl;
0299 }
0300 
0301 void charged_hadron_ratios()
0302 {
0303   processData();
0304 
0305   pT_proton_ratio.Sumw2();
0306   eta_proton_ratio.Sumw2();
0307   phi_proton_ratio.Sumw2();
0308 
0309   pT_pion_ratio.Sumw2();
0310   eta_pion_ratio.Sumw2();
0311   phi_pion_ratio.Sumw2();
0312 
0313   pT_Kaon_ratio.Sumw2();
0314   eta_Kaon_ratio.Sumw2();
0315   phi_Kaon_ratio.Sumw2();
0316 
0317   pT_proton_histo.Sumw2();
0318   eta_proton_histo.Sumw2();
0319   phi_proton_histo.Sumw2();
0320 
0321   pT_piplus_histo.Sumw2();
0322   eta_piplus_histo.Sumw2();
0323   phi_piplus_histo.Sumw2();
0324 
0325   pT_Kplus_histo.Sumw2();
0326   eta_Kplus_histo.Sumw2();
0327   phi_Kplus_histo.Sumw2(); 
0328 
0329   pT_antiproton_histo.Sumw2();
0330   eta_antiproton_histo.Sumw2();
0331   phi_antiproton_histo.Sumw2();
0332 
0333   pT_piminus_histo.Sumw2();
0334   eta_piminus_histo.Sumw2();
0335   phi_piminus_histo.Sumw2();
0336 
0337   pT_Kminus_histo.Sumw2();
0338   eta_Kminus_histo.Sumw2();
0339   phi_Kminus_histo.Sumw2();
0340 
0341   vector<TH1F> pT_proton_histos = {pT_antiproton_histo, pT_proton_histo};
0342   saveManyPlots(pT_proton_histos, "pT_proton_histos", true, {"#bar{p}", "p"});
0343 
0344   vector<TH1F> pT_pion_histos = {pT_piminus_histo, pT_piplus_histo};
0345   saveManyPlots(pT_pion_histos, "pT_pion_histos", true, {"#pi^{-}", "#pi^{+}"});
0346 
0347   vector<TH1F> pT_Kaon_histos = {pT_Kminus_histo, pT_Kplus_histo};
0348   saveManyPlots(pT_Kaon_histos, "pT_Kaon_histos", true, {"K^{-}", "K^{+}"});
0349 
0350   vector<TH1F> eta_proton_histos = {eta_antiproton_histo, eta_proton_histo};
0351   saveManyPlots(eta_proton_histos, "eta_proton_histos", false, {"#bar{p}", "p"});
0352 
0353   vector<TH1F> eta_pion_histos = {eta_piminus_histo, eta_piplus_histo};
0354   saveManyPlots(eta_pion_histos, "eta_pion_histos", false, {"#pi^{-}", "#pi^{+}"});
0355 
0356   vector<TH1F> eta_Kaon_histos = {eta_Kminus_histo, eta_Kplus_histo};
0357   saveManyPlots(eta_Kaon_histos, "eta_Kaon_histos", false, {"K^{-}", "K^{+}"});
0358 
0359   vector<TH1F> phi_proton_histos = {phi_antiproton_histo, phi_proton_histo};
0360   saveManyPlots(phi_proton_histos, "phi_proton_histos", false, {"#bar{p}", "p"});
0361 
0362   vector<TH1F> phi_pion_histos = {phi_piminus_histo, phi_piplus_histo};
0363   saveManyPlots(phi_pion_histos, "phi_pion_histos", false, {"#pi^{-}", "#pi^{+}"});
0364 
0365   vector<TH1F> phi_Kaon_histos = {phi_Kminus_histo, phi_Kplus_histo};
0366   saveManyPlots(phi_Kaon_histos, "phi_Kaon_histos", false, {"K^{-}", "K^{+}"});
0367 
0368   pT_proton_ratio.Divide(&pT_proton_histo);
0369   eta_proton_ratio.Divide(&eta_proton_histo);
0370   phi_proton_ratio.Divide(&phi_proton_histo);
0371 
0372   pT_pion_ratio.Divide(&pT_piplus_histo);
0373   eta_pion_ratio.Divide(&eta_piplus_histo);
0374   phi_pion_ratio.Divide(&phi_piplus_histo);
0375 
0376   pT_Kaon_ratio.Divide(&pT_Kplus_histo);
0377   eta_Kaon_ratio.Divide(&eta_Kplus_histo);
0378   phi_Kaon_ratio.Divide(&phi_Kplus_histo);
0379 
0380   savePlots(pT_proton_ratio, "pT_proton_ratio");
0381   savePlots(eta_proton_ratio, "eta_proton_ratio");
0382   savePlots(phi_proton_ratio, "phi_proton_ratio");
0383 
0384   savePlots(pT_pion_ratio, "pT_pion_ratio");
0385   savePlots(eta_pion_ratio, "eta_pion_ratio");
0386   savePlots(phi_pion_ratio, "phi_pion_ratio");
0387 
0388   savePlots(pT_Kaon_ratio, "pT_Kaon_ratio");
0389   savePlots(eta_Kaon_ratio, "eta_Kaon_ratio");
0390   savePlots(phi_Kaon_ratio, "phi_Kaon_ratio");
0391 }