File indexing completed on 2025-08-03 08:15:30
0001 #include <cmath>
0002 #include <TFile.h>
0003 #include <TNtuple.h>
0004 #include <TH2D.h>
0005 #include <TCut.h>
0006 #include <Eigen/Dense>
0007
0008
0009 void plot_kshort(std::string inputFile = "./kshort_G4sPHENIX.root", const std::string outputFile = "./kshort_plots.root")
0010 {
0011
0012
0013 bool plotBool = true;
0014 bool savePlot = true;
0015 bool localVerbosity = true;
0016 bool analyzeMassSpectrum = true;
0017
0018 TFile fin(inputFile.c_str());
0019
0020 TNtuple *ntuple;
0021 fin.GetObject("ntp_reco_info",ntuple);
0022
0023
0024
0025
0026
0027
0028
0029 float invariant_mass;
0030 float projected_pathlength_x;
0031 float projected_pathlength_y;
0032 float projected_pathlength_z;
0033 float projected_pathlength;
0034 float vertex_x;
0035 float vertex_y;
0036 float vertex_z;
0037 float projected_mom1_x;
0038 float projected_mom1_y;
0039 float projected_mom1_z;
0040 float projected_mom2_x;
0041 float projected_mom2_y;
0042 float projected_mom2_z;
0043 float projected_pair_dca;
0044 float invariant_pt;
0045 float quality1;
0046 float quality2;
0047 float dca3dxy1;
0048 float dca3dxy2;
0049 float dca3dz1;
0050 float dca3dz2;
0051
0052
0053 ntuple->SetBranchAddress("invariant_mass",&invariant_mass);
0054 ntuple->SetBranchAddress("projected_pathlength_x",&projected_pathlength_x);
0055 ntuple->SetBranchAddress("projected_pathlength_y",&projected_pathlength_y);
0056 ntuple->SetBranchAddress("projected_pathlength_z",&projected_pathlength_z);
0057 ntuple->SetBranchAddress("projected_pathlength",&projected_pathlength);
0058 ntuple->SetBranchAddress("vertex_x",&vertex_x);
0059 ntuple->SetBranchAddress("vertex_y",&vertex_y);
0060 ntuple->SetBranchAddress("vertex_z",&vertex_z);
0061 ntuple->SetBranchAddress("projected_mom1_x",&projected_mom1_x);
0062 ntuple->SetBranchAddress("projected_mom1_y",&projected_mom1_y);
0063 ntuple->SetBranchAddress("projected_mom1_z",&projected_mom1_z);
0064 ntuple->SetBranchAddress("projected_mom2_x",&projected_mom2_x);
0065 ntuple->SetBranchAddress("projected_mom2_y",&projected_mom2_y);
0066 ntuple->SetBranchAddress("projected_mom2_z",&projected_mom2_z);
0067 ntuple->SetBranchAddress("projected_pair_dca",&projected_pair_dca);
0068 ntuple->SetBranchAddress("invariant_pt",&invariant_pt);
0069 ntuple->SetBranchAddress("quality1",&quality1);
0070 ntuple->SetBranchAddress("quality2",&quality2);
0071 ntuple->SetBranchAddress("dca3dxy1",&dca3dxy1);
0072 ntuple->SetBranchAddress("dca3dxy2",&dca3dxy2);
0073 ntuple->SetBranchAddress("dca3dz1",&dca3dz1);
0074 ntuple->SetBranchAddress("dca3dz2",&dca3dz2);
0075
0076
0077 int entries = ntuple->GetEntries();
0078
0079 TH1D *invariant_mass_hist = new TH1D("invariant_mass_hist","Invariant Mass",1000,0.35,0.65);
0080 invariant_mass_hist->SetMinimum(0);
0081 TH2D *pathlengthpathlengthz = new TH2D("pathlengthpathlengthz","path v. pathlength_z",5000,-20.0,20.0,5000,0.0,10.0);
0082 TH2D *pathMass = new TH2D("pathMass","Invariant Mass vs. Path Length",5000,0.0,1.0,5000,0.0,10.0);
0083
0084
0085 int qual_cut = 10;
0086 float pathlength_cut = 0.09;
0087 double track_dca_cut = 0.0105;
0088
0089 for(int i=0; i<entries; ++i)
0090 {
0091 ntuple->GetEntry(i);
0092
0093 Eigen::Vector3f mom1(projected_mom1_x,projected_mom1_y,projected_mom1_z);
0094 Eigen::Vector3f mom2(projected_mom2_x,projected_mom2_y,projected_mom2_z);
0095 Eigen::Vector3f projected_momentum = mom1 + mom2;
0096 Eigen::Vector3f pathLength (projected_pathlength_x,projected_pathlength_y,projected_pathlength_z);
0097 float pathLengthMag = pathLength.norm();
0098
0099 Eigen::Vector3f vertex(vertex_x, vertex_y, vertex_z);
0100 float costheta = pathLength.dot(projected_momentum)/(projected_momentum.norm()*pathLength.norm());
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112 if(costheta < 0.99) continue;
0113 if(abs(projected_pathlength_x) < pathlength_cut || abs(projected_pathlength_y) < pathlength_cut) continue;
0114 if(abs(projected_pair_dca) > 0.055) continue;
0115 if(invariant_pt < 0.1) continue;
0116 if(quality1 > qual_cut || quality2 > qual_cut) continue;
0117 if(dca3dxy1 < track_dca_cut || dca3dxy2 < track_dca_cut || dca3dz1 < track_dca_cut || dca3dz2 < track_dca_cut) continue;
0118
0119 invariant_mass_hist->Fill(invariant_mass);
0120 pathlengthpathlengthz->Fill(projected_pathlength_z,pathLengthMag);
0121 pathMass->Fill(invariant_mass,pathLengthMag);
0122 }
0123
0124 TF1* f = new TF1("f","gaus(0)+[3]+[4]*x",0.45,0.55);
0125
0126 if(plotBool)
0127 {
0128 TCanvas *c1 = new TCanvas("c1","",10,10,800,800);
0129
0130 f->SetParameter(0,20);
0131 f->SetParameter(1,0.497);
0132 f->SetParameter(2,0.020);
0133 f->SetParameter(3,0.0);
0134 f->SetParameter(4,0.0);
0135
0136 invariant_mass_hist->Fit("f","R L");
0137 invariant_mass_hist->DrawCopy();
0138 }
0139
0140
0141 int binLow = invariant_mass_hist->FindBin(0.48);
0142 int binHigh = invariant_mass_hist->FindBin(0.52);
0143 double integral = invariant_mass_hist->Integral(binLow,binHigh);
0144
0145 TF1* fbackground = new TF1("fbackground","[0]+[1]*x");
0146 fbackground->SetParameter(0,f->GetParameter(3));
0147 fbackground->SetParameter(1,f->GetParameter(4));
0148
0149 double backgroundIntegral = fbackground->Integral(0.485,0.51);
0150 double foregroundIntegral = f->Integral(0.485,0.51);
0151 double signal = (foregroundIntegral - backgroundIntegral);
0152 double signalBackgroundRatio = signal/backgroundIntegral;
0153
0154
0155 TF1* fsignal = new TF1("fsignal","gaus(0)");
0156 fsignal->SetParameter(0,f->GetParameter(0));
0157 fsignal->SetParameter(1,f->GetParameter(1));
0158 fsignal->SetParameter(2,f->GetParameter(2));
0159 double signal_integral = fsignal->Integral(0.35,0.65);
0160 double binwidth = invariant_mass_hist->GetBinWidth(1);
0161
0162 if(plotBool)
0163 {
0164 TCanvas *c2 = new TCanvas("c2","",10,10,600,600);
0165 pathlengthpathlengthz->DrawCopy();
0166
0167 TCanvas *c3 = new TCanvas("c3","",10,10,600,600);
0168 pathMass->DrawCopy();
0169 }
0170
0171 if(localVerbosity)
0172 {
0173 std::cout << " Integral: "<< integral << std::endl;
0174 std::cout<< "signal: " << signal<<" Signal to background ratio: " << signalBackgroundRatio << std::endl;
0175 std::cout << " Signal Integral: "<< signal_integral<< " yield: "<< signal_integral/binwidth<<std::endl;
0176 }
0177
0178 if(savePlot)
0179 {
0180 std::unique_ptr<TFile> kShortFile(TFile::Open(outputFile.c_str(), "recreate"));
0181 kShortFile->WriteObject(invariant_mass_hist,"invariant_mass");
0182 kShortFile->WriteObject(pathlengthpathlengthz,"pathlength_v_pathlengthz");
0183 kShortFile->WriteObject(pathMass,"pathlength_v_invariantMass");
0184 }
0185
0186 }