File indexing completed on 2026-07-16 08:11:22
0001 #include <TFile.h>
0002 #include <TTree.h>
0003 #include <TH1F.h>
0004 #include <TH2F.h>
0005 #include <TCanvas.h>
0006 #include <TStyle.h>
0007 #include <TLegend.h>
0008 #include <TPaveText.h>
0009 #include <TLine.h>
0010 #include <TGraphAsymmErrors.h>
0011 #include <RooRealVar.h>
0012 #include <RooGaussian.h>
0013 #include <RooChebychev.h>
0014 #include <RooPolynomial.h>
0015 #include <RooAddPdf.h>
0016 #include <RooDataSet.h>
0017 #include <RooFitResult.h>
0018 #include <RooPlot.h>
0019 #include <RooArgList.h>
0020 #include <TMath.h>
0021 #include <iostream>
0022 #include <fstream>
0023 #include <vector>
0024 #include <string>
0025 #include <cmath>
0026
0027 using namespace RooFit;
0028
0029 std::string getDate()
0030 {
0031 std::time_t t = std::time(0);
0032 std::tm* now = std::localtime(&t);
0033
0034 std::stringstream date;
0035 date << (now->tm_mon + 1) << '/'
0036 << now->tm_mday << '/'
0037 << (now->tm_year + 1900);
0038 return date.str();
0039 }
0040
0041 template <typename T>
0042 string to_string_with_precision(const T a_value, const int n = 2)
0043 {
0044 ostringstream out;
0045 out.precision(n);
0046 out << fixed << a_value;
0047 return out.str();
0048 }
0049
0050 std::pair<double,double> GetKS0Yield(TTree* inTree, bool savePlots, std::string binType, int binNumber)
0051 {
0052 RooRealVar mass("K_S0_mass", "mass", 0.45, 0.55);
0053 RooDataSet dataSet("K_S0_mass", "data", mass, Import(*inTree));
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 RooRealVar mean1_KS0("KS0_mean1", "KS0_mean1", 0.49, 0.48, 0.50);
0070 RooRealVar sigma1_KS0("sigma1_KS0", "sigma1_KS0", 0.01, 0.0005, 0.5);
0071 RooGaussian gaus1("gaus1", "gaus1", mass, mean1_KS0, sigma1_KS0);
0072 RooRealVar mean2_KS0("KS0_mean2", "KS0_mean2", 0.49, 0.48, 0.50);
0073 RooRealVar sigma2_KS0("sigma2_KS0", "sigma2_KS0", 0.01, 0.0005, 0.5);
0074 RooGaussian gaus2("gaus2", "gaus2", mass, mean2_KS0, sigma2_KS0);
0075 RooRealVar mean3_KS0("KS0_mean3", "KS0_mean3", 0.49, 0.48, 0.50);
0076 RooRealVar sigma3_KS0("sigma3_KS0", "sigma3_KS0", 0.01, 0.0005, 0.5);
0077 RooGaussian gaus3("gaus3", "gaus3", mass, mean3_KS0, sigma3_KS0);
0078 RooRealVar f1("f1","f1",0.6,0.0,1.0);
0079 RooRealVar f2("f2","f2",0.3,0.0,1.0);
0080 RooAddPdf signal_KS0("signal_KS0","signal_KS0",RooArgList(gaus1,gaus2,gaus3),RooArgList(f1,f2));
0081 RooRealVar fSig_KS0("fSig_KS0", "fSig_KS0", 0.9*dataSet.numEntries(), 0.5*dataSet.numEntries(), 1.2*dataSet.numEntries());
0082
0083
0084
0085 RooRealVar p1("p1","coeff #1", 0., -100., 100.);
0086 RooPolynomial background("background","background", mass, RooArgList(p1));
0087
0088
0089
0090
0091
0092
0093 RooRealVar fBkg("fBkg", "fBkg", 0.5*dataSet.numEntries(), 0., dataSet.numEntries());
0094
0095 RooArgList fitModelList(signal_KS0, background), fitFracList(fSig_KS0, fBkg);
0096 RooAddPdf model("model", "model", fitModelList, fitFracList);
0097 RooFitResult* r = model.fitTo(dataSet, Save(true), Extended(true), PrintLevel(-1));
0098 r->Print();
0099
0100 double fitYield = fSig_KS0.getValV();
0101 double fitYieldErr = fSig_KS0.getError();
0102
0103 if (savePlots)
0104 {
0105 RooPlot* frame = mass.frame(Title(""));
0106
0107 RooBinning bins(0.45, 0.55);
0108 int nBins = 40;
0109 bins.addUniform(nBins, 0.45, 0.55);
0110
0111 dataSet.plotOn(frame, Binning(bins), XErrorSize(0), DataError(RooAbsData::SumW2));
0112 model.plotOn(frame, Components(background), LineColor(kGray), DrawOption("F"), FillColor(kGray));
0113 model.plotOn(frame, Components(RooArgSet(signal_KS0, background)), LineColor(kAzure+8), DrawOption("F"), FillColor(kAzure+8), MoveToBack());
0114 model.plotOn(frame, LineColor(kBlack));
0115 dataSet.plotOn(frame, DrawOption("PE1"), Binning(bins),XErrorSize(0), DataError(RooAbsData::SumW2));
0116 RooHist* pull = frame->pullHist();
0117 RooPlot* frame2 = mass.frame(Title(""));
0118 frame2->addPlotable(pull,"PE1");
0119
0120 TCanvas* c = new TCanvas("massFitCanvas", "massFitCanvas",800, 800);
0121
0122 TPad mainPad("mainPad", "mainPad", 0., 0.3, 1., 1.);
0123 mainPad.SetBottomMargin(0.0);
0124
0125 mainPad.Draw();
0126
0127 TPad pullPad("pullPad", "pullPad", 0., 0.0, 1., 0.3);
0128 pullPad.SetBottomMargin(0.5);
0129 pullPad.SetTopMargin(0);
0130
0131 pullPad.Draw();
0132
0133 mainPad.cd();
0134
0135 frame->SetMarkerStyle(kCircle);
0136 frame->SetMarkerSize(0.02);
0137 frame->SetLineWidth(1);
0138 frame->GetXaxis()->SetNdivisions(505);
0139 frame->GetXaxis()->SetTitle("m(#pi^{+}#pi^{-}) [GeV/c^{2}]");
0140 frame->GetXaxis()->SetTitleOffset(0.9);
0141 frame->GetXaxis()->SetTitleFont(42);
0142 frame->GetXaxis()->SetLabelFont(42);
0143 frame->GetYaxis()->SetTitleFont(42);
0144 frame->GetYaxis()->SetLabelFont(42);
0145 double maxVal = frame->GetMaximum();
0146 frame->GetYaxis()->SetRangeUser(1.0, maxVal*1.5);
0147 float binWidth = 1000.*(0.55 - 0.45) / nBins;
0148 string yAxisTitle = "Candidates / (" + to_string_with_precision(binWidth, 0) + " MeV)";
0149 frame->GetYaxis()->SetTitle(yAxisTitle.c_str());
0150 frame->Draw();
0151
0152
0153
0154
0155
0156 TPaveText *pt;
0157 pt = new TPaveText(0.52,0.59,0.90,0.90, "NDC");
0158 pt->SetFillColor(0);
0159 pt->SetFillStyle(0);
0160 pt->SetTextFont(42);
0161 TText *pt_LaTex = pt->AddText("#it{#bf{sPHENIX}} Internal");
0162 pt_LaTex = pt->AddText("#it{p}+#it{p} #sqrt{s} = 200 GeV");
0163
0164 pt->SetBorderSize(0);
0165 pt->DrawClone();
0166
0167 TPaveText *ptDate;
0168 ptDate = new TPaveText(0.67,0.92,1.05,1.00, "NDC");
0169 ptDate->SetFillColor(0);
0170 ptDate->SetFillStyle(0);
0171 ptDate->SetTextFont(42);
0172 std::string compilation_date = getDate();
0173 TText *pt_LaTexDate = ptDate->AddText(compilation_date.c_str());
0174 ptDate->SetBorderSize(0);
0175 ptDate->Draw();
0176 gPad->Modified();
0177
0178 gPad->SetTopMargin(0.08);
0179
0180 frame->Print();
0181 TLegend *legend = new TLegend(0.19,0.70,0.52,0.90);
0182 legend->AddEntry(frame->findObject("h_K_S0_mass"),"Data","PE2");
0183 legend->AddEntry(frame->findObject("model_Norm[K_S0_mass]"),"Fit","L");
0184 legend->AddEntry(frame->findObject("model_Norm[K_S0_mass]_Comp[signal_KS0,background]"),"K_{S}^{0}#rightarrow#pi^{+}#pi^{-}","f");
0185 legend->AddEntry(frame->findObject("model_Norm[K_S0_mass]_Comp[background]"),"Comb. Bkg.","f");
0186 legend->SetFillColor(0);
0187 legend->SetFillStyle(0);
0188 legend->SetBorderSize(0);
0189 legend->SetTextSize(0.05);
0190 legend->Draw();
0191
0192 gPad->Modified();
0193 pullPad.cd();
0194
0195 frame2->SetMarkerStyle(kCircle);
0196 frame2->SetMarkerSize(0.02);
0197 frame2->SetTitle("");
0198 frame2->GetXaxis()->SetNdivisions(505);
0199 frame2->GetXaxis()->SetTitle("m(#pi^{+}#pi^{-}) [GeV/c^{2}]");
0200 frame2->GetXaxis()->SetTitleOffset(0.9);
0201 frame2->GetXaxis()->SetTitleFont(42);
0202 frame2->GetXaxis()->SetTitleSize(0.12);
0203 frame2->GetXaxis()->SetLabelFont(42);
0204 frame2->GetXaxis()->SetLabelSize(0.12);
0205 frame2->GetYaxis()->SetTitle("Pull");
0206 frame2->GetYaxis()->SetTitleOffset(0.55);
0207 frame2->GetYaxis()->SetTitleFont(42);
0208 frame2->GetYaxis()->SetTitleSize(0.12);
0209 frame2->GetYaxis()->SetLabelFont(42);
0210 frame2->GetYaxis()->SetLabelSize(0.12);
0211 frame2->GetYaxis()->SetRangeUser(-6, 6);
0212 frame2->GetYaxis()->SetNdivisions(5);
0213 TF1 *plusThreeLine = new TF1("plusThreeLine", "pol1", 0.45, 0.55);
0214 plusThreeLine->SetParameters(3, 0);
0215 plusThreeLine->SetLineColor(1);
0216 plusThreeLine->SetLineStyle(2);
0217 plusThreeLine->SetLineWidth(2);
0218 TF1 *zeroLine = new TF1("zeroLine", "pol1",0.45, 0.55);
0219 zeroLine->SetParameters(0, 0);
0220 zeroLine->SetLineColor(1);
0221 zeroLine->SetLineStyle(2);
0222 zeroLine->SetLineWidth(2);
0223
0224 TF1 *minusThreeLine = new TF1("minusThreeLine", "pol1", 0.45, 0.55);
0225 minusThreeLine->SetParameters(-3, 0);
0226 minusThreeLine->SetLineColor(1);
0227 minusThreeLine->SetLineStyle(2);
0228 minusThreeLine->SetLineWidth(2);
0229 frame2->Draw();
0230 plusThreeLine->Draw("same");
0231 zeroLine->Draw("same");
0232 minusThreeLine->Draw("same");
0233
0234 string outputFile = "./yield_fits/KS0_yield_" + binType + "_bin_" + std::to_string(binNumber) + ".png";
0235 c->SaveAs(outputFile.c_str());
0236 }
0237
0238 return {fitYield, fitYieldErr};
0239 }
0240
0241 std::pair<double,double> GetXiYield(TTree* inTree, bool savePlots, std::string binType, int binNumber)
0242 {
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298 TH1F* h_Xi_mass = new TH1F("h_Xi_mass", ";m(#Lambda^{0}#pi^{-}) [GeV/c^{2}];Candidates / (1 MeV)", 40, 1.3, 1.34);
0299 inTree->Draw("Ximinus_mass>>h_Xi_mass", "", "goff");
0300
0301 TF1* fitFunc = new TF1("gausPlusLinear","[0]*exp(-0.5*((x-[1])/[2])^2) + [3] + [4]*x",1.3, 1.34);
0302 fitFunc->SetLineColor(kRed);
0303 fitFunc->SetParName(0, "Const"); fitFunc->SetParameter(0, 100); fitFunc->SetParLimits(0, 0, 1e4);
0304 fitFunc->SetParName(1, "Mean"); fitFunc->SetParameter(1, 1.32); fitFunc->SetParLimits(1, 1.31, 1.33);
0305 fitFunc->SetParName(2, "Width"); fitFunc->SetParameter(2, 0.002); fitFunc->SetParLimits(2, 0, 0.01);
0306 fitFunc->SetParName(3, "Intercept"); fitFunc->SetParameter(3, 100.); fitFunc->SetParLimits(3, 0., 1e4);
0307 fitFunc->SetParName(4, "Slope"); fitFunc->SetParameter(4, -10.); fitFunc->SetParLimits(4, -1e4, 0.);
0308
0309 double binWidth = h_Xi_mass->GetBinWidth(1);
0310
0311 TCanvas *c1 = new TCanvas("myCanvas", "myCanvas",800,800);
0312
0313 h_Xi_mass->Draw("PE1");
0314 h_Xi_mass->Fit(fitFunc, "ER");
0315
0316 double fitMean = fitFunc->GetParameter(1);
0317 double fitMeanErr = fitFunc->GetParError(1);
0318 double fitWidth = fitFunc->GetParameter(2);
0319 double fitWidthErr = fitFunc->GetParError(2);
0320
0321 std::cout << "Mean : " << fitMean << "+/-" << fitMeanErr << std::endl;
0322 std::cout << "Width : " << fitWidth << "+/-" << fitWidthErr << std::endl;
0323
0324 double A = fitFunc->GetParameter(0);
0325 double sigma = fitFunc->GetParameter(2);
0326 double Aerr = fitFunc->GetParError(0);
0327 double sigerr = fitFunc->GetParError(2);
0328
0329 double fitYield = (A * sigma * sqrt(2 * TMath::Pi()))/binWidth;
0330 double fitYieldErr = sqrt(2 * TMath::Pi()) / binWidth
0331 * sqrt(pow(sigma * Aerr, 2) + pow(A * sigerr, 2));
0332
0333 string outputFile = "./yield_fits/Xi_yield_" + binType + "_bin_" + std::to_string(binNumber) + ".png";
0334 c1->SaveAs(outputFile.c_str());
0335
0336 if (savePlots)
0337 {
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471 }
0472
0473 return {fitYield, fitYieldErr};
0474 }
0475
0476 void XiKS0_SingleBin_Calculator(std::string binType = "pT", int binNumber = 0, bool saveYieldPlots = false)
0477 {
0478 TFile* KS0DataFile = new TFile("/sphenix/user/rosstom/TrackingAnalysis/Physics_Val_TF/data/analysisMacros/KShort_fullDataset_finalCuts_0p2pTCut_rapidity1p0Cut_BCOcut_.root");
0479 TTree* KS0DataTree = (TTree*)KS0DataFile->Get("DecayTree");
0480
0481 TFile* XiDataFile = new TFile("/sphenix/user/rosstom/TrackingAnalysis/Physics_Val_TF/data/analysisMacros/Ximinus_fullDataset_finalCuts_0p2pTCut_rapidity1p0Cut_BCOcut_.root");
0482 TTree* XiDataTree = (TTree*)XiDataFile->Get("DecayTree");
0483
0484 const int nBins_pT = 4;
0485 double pTbins[nBins_pT + 1] = {0.75, 1.07, 1.25, 1.49, 2.0};
0486 const int nBins_phi = 6;
0487
0488 double phibins[nBins_phi + 1] = {-M_PI,-2.09439,-1.04719,0.0,1.04721,2.09441,M_PI};
0489 const int nBins_eta = 6;
0490
0491 double etabins[nBins_eta + 1] = {-1.1,-0.733333,-0.366666,0.0,0.366668,0.733335,1.1};
0492 const int nBins_rap = 6;
0493
0494 double rapbins[nBins_rap + 1] = {-1.0,-0.66,-0.33,0.0,0.33,0.66,1.0};
0495
0496 double KS02pipi_BR_PDG = 0.6920;
0497 double KS02pipi_BR_uncert_PDG = 0.0005;
0498 double Xi2Lambdapi_BR_PDG = 0.99887;
0499 double Xi2Lambdapi_BR_uncert_PDG = 0.00035;
0500 double Lambda2ppi_BR_PDG = 0.641;
0501 double Lambda2ppi_BR_uncert_PDG = 0.005;
0502
0503 std::string geomAccept_dir = "/sphenix/user/rosstom/analysis/LightFlavorRatios/geometric_acceptance/analysis/plots_evaluator/";
0504 std::string cutEff_dir = "/sphenix/user/rosstom/TrackingAnalysis/Physics_Val_TF/sim/pTComp/";
0505 std::string trackAccept_dir = "/sphenix/user/rosstom/analysis/LightFlavorRatios/bachelor_pi_efficiency/analysis/";
0506
0507 std::string tempFileString;
0508
0509 double ratioValue;
0510 double ratioUncertainty;
0511 if (binType == "pT")
0512 {
0513 if (binNumber >= nBins_pT)
0514 {
0515 std::cout << "ERROR: Bin value out of range for this bin type" << std::endl;
0516 return;
0517 }
0518 std::string binCut_KS0;
0519 std::string binCut_Xi;
0520 if (binNumber == nBins_pT - 1)
0521 {
0522 binCut_KS0 = Form("K_S0_pT >= %f && K_S0_pT <= %f", pTbins[binNumber],pTbins[binNumber+1]);
0523 binCut_Xi = Form("Ximinus_pT >= %f && Ximinus_pT <= %f && Lambda0_track_1_charge == track_3_charge", pTbins[binNumber],pTbins[binNumber+1]);
0524 }
0525 else
0526 {
0527 binCut_KS0 = Form("K_S0_pT >= %f && K_S0_pT < %f", pTbins[binNumber],pTbins[binNumber+1]);
0528 binCut_Xi = Form("Ximinus_pT >= %f && Ximinus_pT < %f && Lambda0_track_1_charge == track_3_charge", pTbins[binNumber],pTbins[binNumber+1]);
0529 }
0530
0531 tempFileString = "temp_cut_trees_trash_" + binType + "_" + std::to_string(binNumber) + ".root";
0532 TFile* tempFile = new TFile(tempFileString.c_str(), "RECREATE");
0533 TTree* KS0DataTree_cut = KS0DataTree->CopyTree(binCut_KS0.c_str());
0534 TTree* XiDataTree_cut = XiDataTree->CopyTree(binCut_Xi.c_str());
0535
0536 std::cout << "Extracting KS0 yield" << std::endl;
0537 std::pair<double,double> KS0_yield_uncert = GetKS0Yield(KS0DataTree_cut, saveYieldPlots, binType, binNumber);
0538 std::cout << "KS0 yield = " << KS0_yield_uncert.first << " +/- " << KS0_yield_uncert.second << std::endl;
0539 std::cout << "Extracting Xi yield" << std::endl;
0540 std::pair<double,double> Xi_yield_uncert = GetXiYield(XiDataTree_cut, saveYieldPlots, binType, binNumber);
0541 std::cout << "Xi yield = " << Xi_yield_uncert.first << " +/- " << Xi_yield_uncert.second << std::endl;
0542
0543 tempFile->Close();
0544
0545
0546 ratioValue = Xi_yield_uncert.first/(2*KS0_yield_uncert.first);
0547 ratioUncertainty = std::sqrt(std::pow((Xi_yield_uncert.second/(2*KS0_yield_uncert.first)),2) +
0548 std::pow(((KS0_yield_uncert.second*Xi_yield_uncert.first)/(2*std::pow(KS0_yield_uncert.first,2))),2));
0549 std::cout << "Raw ratio value : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0550
0551 std::string outfile_name = "Xi_KS0_ratio_TriGauss_Linear_" + binType + "_bin_" + std::to_string(binNumber) + ".txt";
0552 std::ofstream outFile(outfile_name.c_str());
0553 outFile << KS0_yield_uncert.first << "\n";
0554 outFile << KS0_yield_uncert.second << "\n";
0555 outFile << Xi_yield_uncert.first << "\n";
0556 outFile << Xi_yield_uncert.second << "\n";
0557 outFile.close();
0558
0559
0560 std::string geoAccFile = geomAccept_dir + "Ximinus_to_KS0_geometric_acceptance_ratio_onlyPrimaries_pT.root";
0561 TFile* f_geoAccFile = TFile::Open(geoAccFile.c_str(), "READ");
0562 TCanvas* c_geoAccFile = (TCanvas*)f_geoAccFile->Get("myCanvas");
0563 TH1F* h_geoAccFile = (TH1F*)c_geoAccFile->GetPrimitive("Ximinus_inGeo_pT");
0564 double binContent = h_geoAccFile->GetBinContent(binNumber+1);
0565 double binError = h_geoAccFile->GetBinError(binNumber+1);
0566 ratioValue = ratioValue/binContent;
0567 ratioUncertainty = ratioUncertainty/binContent;
0568 std::cout << "Ratio with geometric acceptance correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0569 f_geoAccFile->Close();
0570
0571
0572 std::string cutEffFile = cutEff_dir + "XiKS0ratio_pT_cutEff.root";
0573 TFile* f_cutEffFile = TFile::Open(cutEffFile.c_str(), "READ");
0574 TCanvas* c_cutEffFile = (TCanvas*)f_cutEffFile->Get("myCanvas");
0575 TGraphAsymmErrors* g_cutEffFile = (TGraphAsymmErrors*)c_cutEffFile->GetPrimitive("Graph");
0576 double binCenter;
0577 g_cutEffFile->GetPoint(binNumber, binCenter, binContent);
0578 binError = g_cutEffFile->GetErrorYhigh(binNumber);
0579 ratioValue = ratioValue/binContent;
0580 ratioUncertainty = ratioUncertainty/binContent;
0581 std::cout << "Ratio with cut efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0582 f_cutEffFile->Close();
0583
0584
0585 std::string trackAccFile = trackAccept_dir + "trackingAcceptanceEfficiencyCorrections_withSystematics.root";
0586 TFile* f_trackAccFile = TFile::Open(trackAccFile.c_str(), "READ");
0587 TH1F* h_trackAccFile = (TH1F*)f_trackAccFile->Get("h_pT_corrections");
0588 binContent = h_trackAccFile->GetBinContent(binNumber+1);
0589 binError = h_trackAccFile->GetBinError(binNumber+1);
0590 ratioValue = ratioValue/binContent;
0591 ratioUncertainty = ratioUncertainty/binContent;
0592 std::cout << "Ratio with tracking acceptance and efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0593 f_trackAccFile->Close();
0594
0595
0596 ratioValue = ratioValue*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0597 ratioUncertainty = ratioUncertainty*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0598 std::cout << "Ratio with branching ratio correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0599 }
0600 else if (binType == "eta")
0601 {
0602 if (binNumber >= nBins_eta)
0603 {
0604 std::cout << "ERROR: Bin value out of range for this bin type" << std::endl;
0605 return;
0606 }
0607 std::string binCut_KS0;
0608 std::string binCut_Xi;
0609 if (binNumber == nBins_eta - 1)
0610 {
0611 binCut_KS0 = Form("K_S0_pseudorapidity >= %f && K_S0_pseudorapidity <= %f", etabins[binNumber],etabins[binNumber+1]);
0612 binCut_Xi = Form("Ximinus_pseudorapidity >= %f && Ximinus_pseudorapidity <= %f && Lambda0_track_1_charge == track_3_charge", etabins[binNumber],etabins[binNumber+1]);
0613 }
0614 else
0615 {
0616 binCut_KS0 = Form("K_S0_pseudorapidity >= %f && K_S0_pseudorapidity < %f", etabins[binNumber],etabins[binNumber+1]);
0617 binCut_Xi = Form("Ximinus_pseudorapidity >= %f && Ximinus_pseudorapidity < %f && Lambda0_track_1_charge == track_3_charge", etabins[binNumber],etabins[binNumber+1]);
0618 }
0619
0620 tempFileString = "temp_cut_trees_trash_" + binType + "_" + std::to_string(binNumber) + ".root";
0621 TFile* tempFile = new TFile(tempFileString.c_str(), "RECREATE");
0622 TTree* KS0DataTree_cut = KS0DataTree->CopyTree(binCut_KS0.c_str());
0623 TTree* XiDataTree_cut = XiDataTree->CopyTree(binCut_Xi.c_str());
0624
0625 std::cout << "Extracting KS0 yield" << std::endl;
0626 std::pair<double,double> KS0_yield_uncert = GetKS0Yield(KS0DataTree_cut, saveYieldPlots, binType, binNumber);
0627 std::cout << "KS0 yield = " << KS0_yield_uncert.first << " +/- " << KS0_yield_uncert.second << std::endl;
0628 std::cout << "Extracting Xi yield" << std::endl;
0629 std::pair<double,double> Xi_yield_uncert = GetXiYield(XiDataTree_cut, saveYieldPlots, binType, binNumber);
0630 std::cout << "Xi yield = " << Xi_yield_uncert.first << " +/- " << Xi_yield_uncert.second << std::endl;
0631
0632 tempFile->Close();
0633
0634
0635 ratioValue = Xi_yield_uncert.first/(2*KS0_yield_uncert.first);
0636 ratioUncertainty = std::sqrt(std::pow((Xi_yield_uncert.second/(2*KS0_yield_uncert.first)),2) +
0637 std::pow(((KS0_yield_uncert.second*Xi_yield_uncert.first)/(2*std::pow(KS0_yield_uncert.first,2))),2));
0638 std::cout << "Raw ratio value : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0639
0640 std::string outfile_name = "Xi_KS0_ratio_TriGauss_Linear_" + binType + "_bin_" + std::to_string(binNumber) + ".txt";
0641 std::ofstream outFile(outfile_name.c_str());
0642 outFile << KS0_yield_uncert.first << "\n";
0643 outFile << KS0_yield_uncert.second << "\n";
0644 outFile << Xi_yield_uncert.first << "\n";
0645 outFile << Xi_yield_uncert.second << "\n";
0646 outFile.close();
0647
0648
0649 std::string geoAccFile = geomAccept_dir + "Ximinus_to_KS0_geometric_acceptance_ratio_onlyPrimaries_eta.root";
0650 TFile* f_geoAccFile = TFile::Open(geoAccFile.c_str(), "READ");
0651 TCanvas* c_geoAccFile = (TCanvas*)f_geoAccFile->Get("myCanvas");
0652 TH1F* h_geoAccFile = (TH1F*)c_geoAccFile->GetPrimitive("Ximinus_inGeo_#eta");
0653 double binContent = h_geoAccFile->GetBinContent(binNumber+1);
0654 double binError = h_geoAccFile->GetBinError(binNumber+1);
0655 ratioValue = ratioValue/binContent;
0656 ratioUncertainty = ratioUncertainty/binContent;
0657 std::cout << "Ratio with geometric acceptance correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0658 f_geoAccFile->Close();
0659
0660
0661 std::string cutEffFile = cutEff_dir + "XiKS0ratio_eta_cutEff.root";
0662 TFile* f_cutEffFile = TFile::Open(cutEffFile.c_str(), "READ");
0663 TCanvas* c_cutEffFile = (TCanvas*)f_cutEffFile->Get("myCanvas");
0664 TGraphAsymmErrors* g_cutEffFile = (TGraphAsymmErrors*)c_cutEffFile->GetPrimitive("Graph");
0665 double binCenter;
0666 g_cutEffFile->GetPoint(binNumber, binCenter, binContent);
0667 binError = g_cutEffFile->GetErrorYhigh(binNumber);
0668 ratioValue = ratioValue/binContent;
0669 ratioUncertainty = ratioUncertainty/binContent;
0670 std::cout << "Ratio with cut efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0671 f_cutEffFile->Close();
0672
0673
0674 std::string trackAccFile = trackAccept_dir + "trackingAcceptanceEfficiencyCorrections_withSystematics.root";
0675 TFile* f_trackAccFile = TFile::Open(trackAccFile.c_str(), "READ");
0676 TH1F* h_trackAccFile = (TH1F*)f_trackAccFile->Get("h_eta_corrections");
0677 binContent = h_trackAccFile->GetBinContent(binNumber+1);
0678 binError = h_trackAccFile->GetBinError(binNumber+1);
0679 ratioValue = ratioValue/binContent;
0680 ratioUncertainty = ratioUncertainty/binContent;
0681 std::cout << "Ratio with tracking acceptance and efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0682 f_trackAccFile->Close();
0683
0684
0685 ratioValue = ratioValue*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0686 ratioUncertainty = ratioUncertainty*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0687 std::cout << "Ratio with branching ratio correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0688 }
0689 else if (binType == "phi")
0690 {
0691 if (binNumber >= nBins_phi)
0692 {
0693 std::cout << "ERROR: Bin value out of range for this bin type" << std::endl;
0694 return;
0695 }
0696 std::string binCut_KS0;
0697 std::string binCut_Xi;
0698 if (binNumber == nBins_phi - 1)
0699 {
0700 binCut_KS0 = Form("K_S0_phi >= %f && K_S0_phi <= %f", phibins[binNumber],phibins[binNumber+1]);
0701 binCut_Xi = Form("Ximinus_phi >= %f && Ximinus_phi <= %f && Lambda0_track_1_charge == track_3_charge", phibins[binNumber],phibins[binNumber+1]);
0702 }
0703 else
0704 {
0705 binCut_KS0 = Form("K_S0_phi >= %f && K_S0_phi < %f", phibins[binNumber],phibins[binNumber+1]);
0706 binCut_Xi = Form("Ximinus_phi >= %f && Ximinus_phi < %f && Lambda0_track_1_charge == track_3_charge", phibins[binNumber],phibins[binNumber+1]);
0707 }
0708
0709 tempFileString = "temp_cut_trees_trash_" + binType + "_" + std::to_string(binNumber) + ".root";
0710 TFile* tempFile = new TFile(tempFileString.c_str(), "RECREATE");
0711 TTree* KS0DataTree_cut = KS0DataTree->CopyTree(binCut_KS0.c_str());
0712 TTree* XiDataTree_cut = XiDataTree->CopyTree(binCut_Xi.c_str());
0713
0714 std::cout << "Extracting KS0 yield" << std::endl;
0715 std::pair<double,double> KS0_yield_uncert = GetKS0Yield(KS0DataTree_cut, saveYieldPlots, binType, binNumber);
0716 std::cout << "KS0 yield = " << KS0_yield_uncert.first << " +/- " << KS0_yield_uncert.second << std::endl;
0717 std::cout << "Extracting Xi yield" << std::endl;
0718 std::pair<double,double> Xi_yield_uncert = GetXiYield(XiDataTree_cut, saveYieldPlots, binType, binNumber);
0719 std::cout << "Xi yield = " << Xi_yield_uncert.first << " +/- " << Xi_yield_uncert.second << std::endl;
0720
0721 tempFile->Close();
0722
0723
0724 ratioValue = Xi_yield_uncert.first/(2*KS0_yield_uncert.first);
0725 ratioUncertainty = std::sqrt(std::pow((Xi_yield_uncert.second/(2*KS0_yield_uncert.first)),2) +
0726 std::pow(((KS0_yield_uncert.second*Xi_yield_uncert.first)/(2*std::pow(KS0_yield_uncert.first,2))),2));
0727 std::cout << "Raw ratio value : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0728
0729 std::string outfile_name = "Xi_KS0_ratio_TriGauss_Linear_" + binType + "_bin_" + std::to_string(binNumber) + ".txt";
0730 std::ofstream outFile(outfile_name.c_str());
0731 outFile << KS0_yield_uncert.first << "\n";
0732 outFile << KS0_yield_uncert.second << "\n";
0733 outFile << Xi_yield_uncert.first << "\n";
0734 outFile << Xi_yield_uncert.second << "\n";
0735 outFile.close();
0736
0737
0738 std::string geoAccFile = geomAccept_dir + "Ximinus_to_KS0_geometric_acceptance_ratio_onlyPrimaries_phi.root";
0739 TFile* f_geoAccFile = TFile::Open(geoAccFile.c_str(), "READ");
0740 TCanvas* c_geoAccFile = (TCanvas*)f_geoAccFile->Get("myCanvas");
0741 TH1F* h_geoAccFile = (TH1F*)c_geoAccFile->GetPrimitive("Ximinus_inGeo_#phi");
0742 double binContent = h_geoAccFile->GetBinContent(binNumber+1);
0743 double binError = h_geoAccFile->GetBinError(binNumber+1);
0744 ratioValue = ratioValue/binContent;
0745 ratioUncertainty = ratioUncertainty/binContent;
0746 std::cout << "Ratio with geometric acceptance correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0747 f_geoAccFile->Close();
0748
0749
0750 std::string cutEffFile = cutEff_dir + "XiKS0ratio_phi_cutEff.root";
0751 TFile* f_cutEffFile = TFile::Open(cutEffFile.c_str(), "READ");
0752 TCanvas* c_cutEffFile = (TCanvas*)f_cutEffFile->Get("myCanvas");
0753 TGraphAsymmErrors* g_cutEffFile = (TGraphAsymmErrors*)c_cutEffFile->GetPrimitive("Graph");
0754 double binCenter;
0755 g_cutEffFile->GetPoint(binNumber, binCenter, binContent);
0756 binError = g_cutEffFile->GetErrorYhigh(binNumber);
0757 ratioValue = ratioValue/binContent;
0758 ratioUncertainty = ratioUncertainty/binContent;
0759 std::cout << "Ratio with cut efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0760 f_cutEffFile->Close();
0761
0762
0763 std::string trackAccFile = trackAccept_dir + "trackingAcceptanceEfficiencyCorrections_withSystematics.root";
0764 TFile* f_trackAccFile = TFile::Open(trackAccFile.c_str(), "READ");
0765 TH1F* h_trackAccFile = (TH1F*)f_trackAccFile->Get("h_phi_corrections");
0766 binContent = h_trackAccFile->GetBinContent(binNumber+1);
0767 binError = h_trackAccFile->GetBinError(binNumber+1);
0768 ratioValue = ratioValue/binContent;
0769 ratioUncertainty = ratioUncertainty/binContent;
0770 std::cout << "Ratio with tracking acceptance and efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0771 f_trackAccFile->Close();
0772
0773
0774 ratioValue = ratioValue*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0775 ratioUncertainty = ratioUncertainty*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0776 std::cout << "Ratio with branching ratio correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0777 }
0778 else if (binType == "rap")
0779 {
0780 if (binNumber >= nBins_rap)
0781 {
0782 std::cout << "ERROR: Bin value out of range for this bin type" << std::endl;
0783 return;
0784 }
0785 std::string binCut_KS0;
0786 std::string binCut_Xi;
0787 if (binNumber == nBins_rap - 1)
0788 {
0789 binCut_KS0 = Form("K_S0_rapidity >= %f && K_S0_rapidity <= %f", rapbins[binNumber],rapbins[binNumber+1]);
0790 binCut_Xi = Form("Ximinus_rapidity >= %f && Ximinus_rapidity <= %f && Lambda0_track_1_charge == track_3_charge", rapbins[binNumber],rapbins[binNumber+1]);
0791 }
0792 else
0793 {
0794 binCut_KS0 = Form("K_S0_rapidity >= %f && K_S0_rapidity < %f", rapbins[binNumber],rapbins[binNumber+1]);
0795 binCut_Xi = Form("Ximinus_rapidity >= %f && Ximinus_rapidity < %f && Lambda0_track_1_charge == track_3_charge", rapbins[binNumber],rapbins[binNumber+1]);
0796 }
0797
0798 tempFileString = "temp_cut_trees_trash_" + binType + "_" + std::to_string(binNumber) + ".root";
0799 TFile* tempFile = new TFile(tempFileString.c_str(), "RECREATE");
0800 TTree* KS0DataTree_cut = KS0DataTree->CopyTree(binCut_KS0.c_str());
0801 TTree* XiDataTree_cut = XiDataTree->CopyTree(binCut_Xi.c_str());
0802
0803 std::cout << "Extracting KS0 yield" << std::endl;
0804 std::pair<double,double> KS0_yield_uncert = GetKS0Yield(KS0DataTree_cut, saveYieldPlots, binType, binNumber);
0805 std::cout << "KS0 yield = " << KS0_yield_uncert.first << " +/- " << KS0_yield_uncert.second << std::endl;
0806 std::cout << "Extracting Xi yield" << std::endl;
0807 std::pair<double,double> Xi_yield_uncert = GetXiYield(XiDataTree_cut, saveYieldPlots, binType, binNumber);
0808 std::cout << "Xi yield = " << Xi_yield_uncert.first << " +/- " << Xi_yield_uncert.second << std::endl;
0809
0810 tempFile->Close();
0811
0812
0813 ratioValue = Xi_yield_uncert.first/(2*KS0_yield_uncert.first);
0814 ratioUncertainty = std::sqrt(std::pow((Xi_yield_uncert.second/(2*KS0_yield_uncert.first)),2) +
0815 std::pow(((KS0_yield_uncert.second*Xi_yield_uncert.first)/(2*std::pow(KS0_yield_uncert.first,2))),2));
0816 std::cout << "Raw ratio value : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0817
0818 std::string outfile_name = "Xi_KS0_ratio_TriGauss_Linear_" + binType + "_bin_" + std::to_string(binNumber) + ".txt";
0819 std::ofstream outFile(outfile_name.c_str());
0820 outFile << KS0_yield_uncert.first << "\n";
0821 outFile << KS0_yield_uncert.second << "\n";
0822 outFile << Xi_yield_uncert.first << "\n";
0823 outFile << Xi_yield_uncert.second << "\n";
0824 outFile.close();
0825
0826
0827 std::string geoAccFile = geomAccept_dir + "Ximinus_to_KS0_geometric_acceptance_ratio_onlyPrimaries_rap.root";
0828 TFile* f_geoAccFile = TFile::Open(geoAccFile.c_str(), "READ");
0829 TCanvas* c_geoAccFile = (TCanvas*)f_geoAccFile->Get("myCanvas");
0830 TH1F* h_geoAccFile = (TH1F*)c_geoAccFile->GetPrimitive("Ximinus_inGeo_y");
0831 double binContent = h_geoAccFile->GetBinContent(binNumber+1);
0832 double binError = h_geoAccFile->GetBinError(binNumber+1);
0833 ratioValue = ratioValue/binContent;
0834 ratioUncertainty = ratioUncertainty/binContent;
0835 std::cout << "Ratio with geometric acceptance correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0836 f_geoAccFile->Close();
0837
0838
0839 std::string cutEffFile = cutEff_dir + "XiKS0ratio_y_cutEff.root";
0840 TFile* f_cutEffFile = TFile::Open(cutEffFile.c_str(), "READ");
0841 TCanvas* c_cutEffFile = (TCanvas*)f_cutEffFile->Get("myCanvas");
0842 TGraphAsymmErrors* g_cutEffFile = (TGraphAsymmErrors*)c_cutEffFile->GetPrimitive("Graph");
0843 double binCenter;
0844 g_cutEffFile->GetPoint(binNumber, binCenter, binContent);
0845 binError = g_cutEffFile->GetErrorYhigh(binNumber);
0846 ratioValue = ratioValue/binContent;
0847 ratioUncertainty = ratioUncertainty/binContent;
0848 std::cout << "Ratio with cut efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0849 f_cutEffFile->Close();
0850
0851
0852 std::string trackAccFile = trackAccept_dir + "trackingAcceptanceEfficiencyCorrections_withSystematics.root";
0853 TFile* f_trackAccFile = TFile::Open(trackAccFile.c_str(), "READ");
0854 TH1F* h_trackAccFile = (TH1F*)f_trackAccFile->Get("h_rap_corrections");
0855 binContent = h_trackAccFile->GetBinContent(binNumber+1);
0856 binError = h_trackAccFile->GetBinError(binNumber+1);
0857 ratioValue = ratioValue/binContent;
0858 ratioUncertainty = ratioUncertainty/binContent;
0859 std::cout << "Ratio with tracking acceptance and efficiency correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0860 f_trackAccFile->Close();
0861
0862
0863 ratioValue = ratioValue*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0864 ratioUncertainty = ratioUncertainty*(KS02pipi_BR_PDG/(Xi2Lambdapi_BR_PDG*Lambda2ppi_BR_PDG));
0865 std::cout << "Ratio with branching ratio correction : " << ratioValue << "+/-" << ratioUncertainty << std::endl;
0866 }
0867
0868
0869
0870
0871
0872
0873 gSystem->Unlink(tempFileString.c_str());
0874 }