diff --git a/benchmarks/barrel_ecal/config.yml b/benchmarks/barrel_ecal/config.yml index eb182f67aa322b354bcd08c2a664d507776e6e47..dadd74175b47614c85d2d646f0241211e47cf84a 100644 --- a/benchmarks/barrel_ecal/config.yml +++ b/benchmarks/barrel_ecal/config.yml @@ -25,6 +25,14 @@ sim:emcal_barrel_photons: - bash benchmarks/barrel_ecal/run_emcal_barrel_energy_scan.sh photon - bash benchmarks/barrel_ecal/run_emcal_barrel_particles.sh photon +sim:emcal_barrel_pions_electrons: + extends: .det_benchmark + stage: simulate + script: + #- bash benchmarks/barrel_ecal/run_emcal_barrel_particles.sh electron + - bash benchmarks/barrel_ecal/run_emcal_barrel_electrons.sh + - bash benchmarks/barrel_ecal/run_emcal_barrel_particles.sh piminus + bench:emcal_barrel_pions: extends: .det_benchmark stage: benchmarks @@ -63,11 +71,22 @@ bench:emcal_barrel_photons: - root -b -q 'benchmarks/barrel_ecal/scripts/emcal_barrel_particles_analysis.cxx+("photon")' - root -b -q 'benchmarks/barrel_ecal/scripts/emcal_barrel_energy_scan_analysis.cxx+("photon")' +bench:emcal_barrel_pions_electrons: + extends: .det_benchmark + stage: benchmarks + needs: + - ["sim:emcal_barrel_pions_electrons"] + script: + - ls -lhtR sim_output/ + - rootls -t sim_output/sim_emcal_barrel_piminus.root + - rootls -t sim_output/sim_emcal_barrel_uniform_electrons.root + - root -b -q benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_analysis.cxx+ + collect_results:barrel_ecal: extends: .det_benchmark stage: collect needs: - - ["bench:emcal_barrel_electrons", "bench:emcal_barrel_photons", "bench:emcal_barrel_pions", "bench:emcal_barrel_pi0"] + - ["bench:emcal_barrel_electrons", "bench:emcal_barrel_photons", "bench:emcal_barrel_pions", "bench:emcal_barrel_pi0", "bench:emcal_barrel_pions_electrons"] script: - ls -lrht - echo " FIX ME" diff --git a/benchmarks/barrel_ecal/run_emcal_barrel_electrons.sh b/benchmarks/barrel_ecal/run_emcal_barrel_electrons.sh index b70563d8273f975e5cc6ae448d440aa85720e02e..7b03df11288ecc0e6ea7496498eb553721d0b325 100755 --- a/benchmarks/barrel_ecal/run_emcal_barrel_electrons.sh +++ b/benchmarks/barrel_ecal/run_emcal_barrel_electrons.sh @@ -8,12 +8,12 @@ if [[ ! -n "${JUGGLER_N_EVENTS}" ]] ; then export JUGGLER_N_EVENTS=100 fi -if [[ ! -n "${E_start}" ]] ; then - export E_start=5.0 +if [[ ! -n "${E_START}" ]] ; then + export E_START=5.0 fi -if [[ ! -n "${E_end}" ]] ; then - export E_end=5.0 +if [[ ! -n "${E_END}" ]] ; then + export E_END=5.0 fi export JUGGLER_FILE_NAME_TAG="emcal_barrel_uniform_electrons" export JUGGLER_GEN_FILE="${JUGGLER_FILE_NAME_TAG}.hepmc" @@ -25,13 +25,13 @@ echo "JUGGLER_N_EVENTS = ${JUGGLER_N_EVENTS}" echo "JUGGLER_DETECTOR = ${JUGGLER_DETECTOR}" # Generate the input events -root -b -q "benchmarks/barrel_ecal/scripts/emcal_barrel_electrons.cxx(${JUGGLER_N_EVENTS}, ${E_start}, ${E_end}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" +root -b -q "benchmarks/barrel_ecal/scripts/emcal_barrel_electrons.cxx(${JUGGLER_N_EVENTS}, ${E_START}, ${E_END}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" if [[ "$?" -ne "0" ]] ; then echo "ERROR running script: generating input events" exit 1 fi # Plot the input events -root -b -q "benchmarks/barrel_ecal/scripts/emcal_barrel_electrons_reader.cxx(${E_start}, ${E_end}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" +root -b -q "benchmarks/barrel_ecal/scripts/emcal_barrel_electrons_reader.cxx(${E_START}, ${E_END}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" if [[ "$?" -ne "0" ]] ; then echo "ERROR running script: plotting input events" exit 1 diff --git a/benchmarks/barrel_ecal/run_emcal_barrel_pions_electrons.sh b/benchmarks/barrel_ecal/run_emcal_barrel_pions_electrons.sh new file mode 100644 index 0000000000000000000000000000000000000000..aa546843348b21a01c58649ddd749e51d33f9a79 --- /dev/null +++ b/benchmarks/barrel_ecal/run_emcal_barrel_pions_electrons.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +if [[ ! -n "${JUGGLER_DETECTOR}" ]] ; then + export JUGGLER_DETECTOR="topside" +fi + +if [[ ! -n "${JUGGLER_N_EVENTS}" ]] ; then + export JUGGLER_N_EVENTS=1000 +fi + +if [[ ! -n "${JUGGLER_INSTALL_PREFIX}" ]] ; then + export JUGGLER_INSTALL_PREFIX="/usr/local" +fi + +if [[ ! -n "${E_start}" ]] ; then + export E_start=5.0 +fi + +if [[ ! -n "${E_end}" ]] ; then + export E_end=5.0 +fi + +export JUGGLER_FILE_NAME_TAG="emcal_barrel_uniform_pions_electrons" +export JUGGLER_GEN_FILE="${JUGGLER_FILE_NAME_TAG}.hepmc" + +export JUGGLER_SIM_FILE="sim_${JUGGLER_FILE_NAME_TAG}.root" +export JUGGLER_REC_FILE="rec_${JUGGLER_FILE_NAME_TAG}.root" + +echo "JUGGLER_N_EVENTS = ${JUGGLER_N_EVENTS}" +echo "JUGGLER_DETECTOR = ${JUGGLER_DETECTOR}" + +# Generate the input events +root -b -q "benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons.cxx(${JUGGLER_N_EVENTS}, ${E_start}, ${E_end}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" +if [[ "$?" -ne "0" ]] ; then + echo "ERROR running script: generating input events" + exit 1 +fi +# Plot the input events +root -b -q "benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_reader.cxx(${E_start}, ${E_end}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")" +if [[ "$?" -ne "0" ]] ; then + echo "ERROR running script: plotting input events" + exit 1 +fi + +# Run geant4 simulations +npsim --runType batch \ + -v WARNING \ + --part.minimalKineticEnergy 0.5*GeV \ + --numberOfEvents ${JUGGLER_N_EVENTS} \ + --compactFile ${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml \ + --inputFiles ${JUGGLER_FILE_NAME_TAG}.hepmc \ + --outputFile sim_output/${JUGGLER_SIM_FILE} + +if [[ "$?" -ne "0" ]] ; then + echo "ERROR running npdet" + exit 1 +fi + +# Directory for plots +mkdir -p results + +# Move ROOT output file +#mv ${JUGGLER_REC_FILE} sim_output/ + diff --git a/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons.cxx b/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e7c343c1b1cfdab1b56028fffe896f58b5fbd42f --- /dev/null +++ b/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons.cxx @@ -0,0 +1,100 @@ + +////////////////////////////////////////////////////////////// +// EMCAL Barrel detector +// Electron & Pion Minus dataset +// M. Scott 05/2021 +////////////////////////////////////////////////////////////// +#include "HepMC3/GenEvent.h" +#include "HepMC3/Print.h" +#include "HepMC3/ReaderAscii.h" +#include "HepMC3/WriterAscii.h" + +#include <TMath.h> +#include <cmath> +#include <iostream> +#include <math.h> +#include <random> + +using namespace HepMC3; + +void emcal_barrel_pions_electrons(int n_events = 1e6, double e_start = 0.0, double e_end = 30.0, const char* out_fname = "./data/emcal_barrel_pions_electrons.hepmc") { + /* + n_events = 1000; + e_start = 5; + e_end = 5; + out_fname = "temp_pions_electrons.hepmc"; + */ + WriterAscii hepmc_output(out_fname); + int events_parsed = 0; + GenEvent evt(Units::GEV, Units::MM); + + // Random number generator + TRandom* r1 = new TRandom(); + + // Constraining the solid angle, but larger than that subtended by the + // detector + // https://indico.bnl.gov/event/7449/contributions/35966/attachments/27177/41430/EIC-DWG-Calo-03192020.pdf + // See a figure on slide 26 + double cos_theta_min = std::cos(M_PI * (45.0 / 180.0)); + double cos_theta_max = std::cos(M_PI * (135.0 / 180.0)); + + for (events_parsed = 0; events_parsed < n_events; events_parsed++) { + // FourVector(px,py,pz,e,pdgid,status) + // type 4 is beam + // pdgid 11 - electron + // pdgid 111 - pi0 + // pdgid 2212 - proton + GenParticlePtr p1 = std::make_shared<GenParticle>(FourVector(0.0, 0.0, 10.0, 10.0), 11, 4); + GenParticlePtr p2 = std::make_shared<GenParticle>(FourVector(0.0, 0.0, 0.0, 0.938), 2212, 4); + + // Define momentum + Double_t p = r1->Uniform(e_start, e_end); + Double_t phi = r1->Uniform(0.0, 2.0 * M_PI); + Double_t costheta = r1->Uniform(cos_theta_min, cos_theta_max); + Double_t theta = std::acos(costheta); + Double_t px = p * std::cos(phi) * std::sin(theta); + Double_t py = p * std::sin(phi) * std::sin(theta); + Double_t pz = p * std::cos(theta); + + // Generates random vectors, uniformly distributed over the surface of a + // sphere of given radius, in this case momentum. + // r1->Sphere(px, py, pz, p); + + // type 1 is final state + // pdgid 211 - pion+ 139.570 MeV/c^2 + // pdgid -211 - pion- 139.570 MeV/c^2 + // pdgid 111 - pion0 134.977 MeV/c^2 + GenParticlePtr p3 = std::make_shared<GenParticle>(FourVector(px, py, pz, sqrt(p * p + (0.139570 * 0.139570))), -211, 1); + + p = r1->Uniform(e_start, e_end); + phi = r1->Uniform(0.0, 2.0 * M_PI); + costheta = r1->Uniform(cos_theta_min, cos_theta_max); + theta = std::acos(costheta); + px = p * std::cos(phi) * std::sin(theta); + py = p * std::sin(phi) * std::sin(theta); + pz = p * std::cos(theta); + GenParticlePtr p4 = std::make_shared<GenParticle>(FourVector(px, py, pz, sqrt(p * p + (0.000511 * 0.000511))), 11, 1); + + GenVertexPtr v1 = std::make_shared<GenVertex>(); + GenVertexPtr v2 = std::make_shared<GenVertex>(); + v1->add_particle_in(p1); + v1->add_particle_in(p2); + + if (r1 -> Uniform(0,1) <= 0.5) {v1->add_particle_out(p3);} + else {v1->add_particle_out(p4);} + evt.add_vertex(v1); + + if (events_parsed == 0) { + std::cout << "First event: " << std::endl; + Print::listing(evt); + } + + hepmc_output.write_event(evt); + if (events_parsed % 10000 == 0) { + std::cout << "Event: " << events_parsed << std::endl; + } + evt.clear(); + } + hepmc_output.close(); + std::cout << "Events parsed and written: " << events_parsed << std::endl; +} diff --git a/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_analysis.cxx b/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_analysis.cxx new file mode 100644 index 0000000000000000000000000000000000000000..9c10e3437b7fcd95d7f2ad7bd00723f39769c2ef --- /dev/null +++ b/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_analysis.cxx @@ -0,0 +1,287 @@ +//////////////////////////////////////// +// Read reconstruction ROOT output file +// Plot variables +//////////////////////////////////////// + +#include "ROOT/RDataFrame.hxx" +#include <iostream> + +#include "dd4pod/Geant4ParticleCollection.h" +#include "dd4pod/CalorimeterHitCollection.h" + +#include "TCanvas.h" +#include "TStyle.h" +#include "TMath.h" +#include "TH1.h" +#include "TF1.h" +#include "TH1D.h" +#include "TFitResult.h" +#include "TLegend.h" +#include "TString.h" + +R__LOAD_LIBRARY(libfmt.so) +#include "fmt/core.h" +#include "DD4hep/Detector.h" +#include "DDG4/Geant4Data.h" +#include "DDRec/CellIDPositionConverter.h" + + +using ROOT::RDataFrame; +using namespace ROOT::VecOps; + +void emcal_barrel_pions_electrons_analysis(const char* input_fname1 = "sim_output/sim_emcal_barrel_piminus.root", const char* input_fname2 = "sim_output/sim_emcal_barrel_uniform_electrons.root") +{ + // Setting for graphs + gROOT->SetStyle("Plain"); + gStyle->SetOptFit(1); + gStyle->SetLineWidth(2); + gStyle->SetPadTickX(1); + gStyle->SetPadTickY(1); + gStyle->SetPadGridX(1); + gStyle->SetPadGridY(1); + gStyle->SetPadLeftMargin(0.14); + gStyle->SetPadRightMargin(0.14); + + ROOT::EnableImplicitMT(); + ROOT::RDataFrame d0("events", {input_fname1, input_fname2}); + + //Using the detector layers + std::string detector_path = ""; + std::string detector_name = "topside"; + if(std::getenv("DETECTOR_PATH")) { + detector_path = std::getenv("DETECTOR_PATH"); + } + if(std::getenv("JUGGLER_DETECTOR")) { + detector_name = std::getenv("JUGGLER_DETECTOR"); + } + + dd4hep::Detector& detector = dd4hep::Detector::getInstance(); + detector.fromCompact(fmt::format("{}/{}.xml", detector_path,detector_name)); + //dd4hep::rec::CellIDPositionConverter cellid_converter(detector); + + auto decoder = detector.readout("EcalBarrelHits").idSpec().decoder(); + fmt::print("{}\n", decoder->fieldDescription()); + auto layer_index = decoder->index("layer"); + fmt::print(" layer index is {}.\n", layer_index); + + // Rejection Value [GeV] based upon Energy deposit in the first 4 layers. + // Currently constructed from looking at tthe pion and electron Energy deposit plots + // should eventually grab a value from a json file + // Suggested cut at 0.005 + double rejectCut = 0.0; + + // Thrown Energy [GeV] + auto Ethr = [](std::vector<dd4pod::Geant4ParticleData> const& input) { + return TMath::Sqrt(input[2].psx*input[2].psx + input[2].psy*input[2].psy + input[2].psz*input[2].psz + input[2].mass*input[2].mass); + }; + + // Thrown Momentum [GeV] + auto Pthr = [](std::vector<dd4pod::Geant4ParticleData> const& input) { + return TMath::Sqrt(input[2].psx*input[2].psx + input[2].psy*input[2].psy + input[2].psz*input[2].psz); + }; + + // Number of hits + auto nhits = [] (const std::vector<dd4pod::CalorimeterHitData>& evt) {return (int) evt.size(); }; + + // Energy deposition [GeV] + auto Esim = [](const std::vector<dd4pod::CalorimeterHitData>& evt) { + auto total_edep = 0.0; + for (const auto& i: evt) + total_edep += i.energyDeposit; + return total_edep; + }; + + // Energy deposititon [GeV] in the first 4 layers + auto Esim_front = [=](const std::vector<dd4pod::CalorimeterHitData>& evt) { + auto total_edep = 0.0; + for (const auto& i: evt) { + //fmt::print("cell id {}, layer {}\n",i.cellID, decoder->get(i.cellID, layer_index)); + if( decoder->get(i.cellID, layer_index) < 4 ){ + total_edep += i.energyDeposit; + } + } + return total_edep; + }; + + // Sampling fraction = Esampling / Ethrown + auto fsam = [](const double& sampled, const double& thrown) { + return sampled / thrown; + }; + + // E_front / p + auto fEp = [](const double& E_front, const double& mom) { + return E_front / mom; + }; + + // Returns the pdgID of the particle + auto getpid = [](std::vector<dd4pod::Geant4ParticleData> const& input) { + return input[2].pdgID; + }; + + // Returns number of particle daughters + auto getdau = [](std::vector<dd4pod::Geant4ParticleData> const& input){ + return input[2].daughters_begin; + }; + + // Filter function to get electrons + auto is_electron = [](std::vector<dd4pod::Geant4ParticleData> const& input){ + if (input[2].pdgID == 11){return true;} + else {return false;} + }; + + // Filter function to get just negative pions + auto is_piMinus = [](std::vector<dd4pod::Geant4ParticleData> const& input){ + if (input[2].pdgID == -211){return true;} + else {return false;} + }; + + // Define variables + auto d1 = d0.Define("Ethr", Ethr, {"mcparticles"}) + .Define("Pthr", Pthr, {"mcparticles"}) + .Define("nhits", nhits, {"EcalBarrelHits"}) + .Define("Esim", Esim, {"EcalBarrelHits"}) + .Define("fsam", fsam, {"Esim","Ethr"}) + .Define("pid", getpid, {"mcparticles"}) + .Define("dau", getdau, {"mcparticles"}) + .Define("Esim_front", Esim_front, {"EcalBarrelHits"}) + .Define("EOverP", fEp, {"Esim_front", "Pthr"}) + ; + + // Particle Filters + auto d_ele = d1.Filter(is_electron, {"mcparticles"}); + auto d_pim = d1.Filter(is_piMinus, {"mcparticles"}); + + // Energy Deposit Filters + auto d_ele_rej = d_ele.Filter("Esim_front > " + to_string(rejectCut)); + auto d_pim_rej = d_pim.Filter("Esim_front > " + to_string(rejectCut)); + + // Define Histograms + auto hEthr = d1.Histo1D({"hEthr", "Thrown Energy; Thrown Energy [GeV]; Events", 100, 0.0, 7.5}, "Ethr"); + auto hNhits = d1.Histo1D({"hNhits", "Number of hits per events; Number of hits; Events", 100, 0.0, 2000.0}, "nhits"); + auto hEsim = d1.Histo1D({"hEsim", "Energy Deposit; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim"); + auto hfsam = d1.Histo1D({"hfsam", "Sampling Fraction; Sampling Fraction; Events", 100, 0.0, 0.1}, "fsam"); + auto hEsim_front = d1.Histo1D({"hEsim_front", "Energy Deposit Front; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim_front"); + + auto hEsim_ele = d_ele.Histo1D({"hEsim_ele", "Energy Deposit Electron; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim"); + auto hEsim_ele_front = d_ele.Histo1D({"hEsim_ele_front", "Energy Deposit Front Electron; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim_front"); + auto hEsim_pim = d_pim.Histo1D({"hEsim_pim", "Energy Deposit Electron; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim"); + auto hEsim_pim_front = d_pim.Histo1D({"hEsim_pim_front", "Energy Deposit Front Pion-; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim_front"); + + auto hEsim_ele_front_rej = d_ele_rej.Histo1D({"hEsim_ele_front_rej", "Energy Deposit Front Electron; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim_front"); + auto hEsim_pim_front_rej = d_pim_rej.Histo1D({"hEsim_pim_front_rej", "Energy Deposit Front Pion-; Energy Deposit [GeV]; Events", 10, 0.0, 0.05}, "Esim_front"); + + auto hEpvp_ele = d_ele.Histo2D({"hEpvp_ele", "Energy Deposit 1st 4 Layers/P vs P; E/P; P [GeV]", 20, 0.0, 0.01, 10, 1.0, 7.0}, "EOverP", "Pthr"); + auto hEpvp_pim = d_pim.Histo2D({"hEpvp_pim", "Energy Deposit 1st 4 Layers/P vs P; E/P; P [GeV]", 20, 0.0, 0.01, 10, 1.0, 7.0}, "EOverP", "Pthr"); + + + TH1D* hElePurity_initial = (TH1D *)hEsim_ele -> Clone(); + hElePurity_initial -> Divide(hEsim.GetPtr()); + hElePurity_initial -> SetTitle("Electron/Pion Rejection"); + + TH1D* hElePurity_ele = (TH1D *)hEsim_ele_front -> Clone(); + hElePurity_ele -> Divide(hEsim_front.GetPtr()); + hElePurity_ele -> SetTitle("Electron/Pion Rejection : Electron"); + + TH1D* hElePurity_pim = (TH1D *)hEsim_pim_front -> Clone(); + hElePurity_pim -> Divide(hEsim_front.GetPtr()); + hElePurity_pim -> SetTitle("Electron/Pion Rejection : Pion Minus"); + + // Rejection + TH1D* hElePurity_rej = (TH1D *)hEsim_ele_front_rej -> Clone(); + hElePurity_rej -> Add(hEsim_pim_front_rej.GetPtr()); + hElePurity_rej -> SetTitle("Electron/Pion Rejection"); + + TH1D* hElePurity_ele_rej = (TH1D *)hEsim_ele_front_rej -> Clone(); + hElePurity_ele_rej -> Divide(hElePurity_rej); + hElePurity_ele_rej -> SetTitle("Electron/Pion Rejection : Electron"); + + TH1D* hElePurity_pim_rej = (TH1D *)hEsim_pim_front_rej -> Clone(); + hElePurity_pim_rej -> Divide(hElePurity_rej); + hElePurity_pim_rej -> SetTitle("Electron/Pion Rejection : Pi Minus"); + + // Event Counts + auto nevents_thrown = d1.Count(); + std::cout << "Number of Thrown Events: " << (*nevents_thrown) << "\n"; + + // Draw Histograms + TCanvas *c1 = new TCanvas("c1", "c1", 700, 500); + c1->SetLogy(1); + hEthr->GetYaxis()->SetTitleOffset(1.4); + hEthr->SetLineWidth(2); + hEthr->SetLineColor(kBlue); + hEthr->DrawClone(); + c1->SaveAs("results/emcal_barrel_pions_electrons_Ethr.png"); + c1->SaveAs("results/emcal_barrel_pions_electrons_Ethr.pdf"); + + TCanvas *c3 = new TCanvas("c3", "c3", 700, 500); + c3->SetLogy(1); + hEsim->GetYaxis()->SetTitleOffset(1.4); + hEsim->SetLineWidth(2); + hEsim->SetLineColor(kBlue); + hEsim->DrawClone(); + c3->SaveAs("results/emcal_barrel_pions_electrons_Esim.png"); + c3->SaveAs("results/emcal_barrel_pions_electrons_Esim.pdf"); + + TCanvas *c4 = new TCanvas("c4", "c4", 700, 500); + c4->SetLogy(1); + hEsim_ele->GetYaxis()->SetTitleOffset(1.4); + hEsim_ele->SetLineWidth(2); + hEsim_ele->SetLineColor(kBlue); + hEsim_ele->DrawClone(); + c4->SaveAs("results/emcal_barrel_pions_electrons_Esim_ele.png"); + c4->SaveAs("results/emcal_barrel_pions_electrons_Esim_ele.pdf"); + + TCanvas *c5 = new TCanvas("c5", "c5", 700, 500); + //c5->SetLogy(1); + hElePurity_initial->GetYaxis()->SetTitleOffset(1.4); + hElePurity_initial->SetLineWidth(2); + hElePurity_initial->SetLineColor(kBlue); + hElePurity_initial->DrawClone(); + c5->SaveAs("results/emcal_barrel_pions_electrons_rejection_initial.png"); + c5->SaveAs("results/emcal_barrel_pions_electrons_rejection_initial.pdf"); + + TCanvas *c6 = new TCanvas("c6", "c6", 700, 500); + //c6->SetLogy(1); + hElePurity_ele->GetYaxis()->SetTitleOffset(1.4); + hElePurity_ele->SetLineWidth(2); + hElePurity_ele->SetLineColor(kBlue); + hElePurity_ele->DrawClone(); + hElePurity_ele_rej->SetLineWidth(2); + hElePurity_ele_rej->SetLineColor(kRed); + hElePurity_ele_rej->SetLineStyle(10); + hElePurity_ele_rej->DrawClone("Same"); + c6->SaveAs("results/emcal_barrel_pions_electrons_rejection_ele.png"); + c6->SaveAs("results/emcal_barrel_pions_electrons_rejection_ele.pdf"); + + auto leg = new TLegend(0.7, 0.8, 0.8, 0.9); + leg->AddEntry(hElePurity_initial, "Initial", "l"); + leg->AddEntry(hElePurity_ele, "Final", "l"); + + TCanvas *c7 = new TCanvas("c7", "c7", 700, 500); + //c6->SetLogy(1); + hElePurity_pim->GetYaxis()->SetTitleOffset(1.4); + hElePurity_pim->SetLineWidth(2); + hElePurity_pim->SetLineColor(kBlue); + hElePurity_pim->DrawClone(); + hElePurity_pim_rej->SetLineWidth(2); + hElePurity_pim_rej->SetLineColor(kRed); + hElePurity_pim_rej->SetLineStyle(10); + hElePurity_pim_rej->DrawClone("Same"); + c7->SaveAs("results/emcal_barrel_pions_electrons_rejection_pim.png"); + c7->SaveAs("results/emcal_barrel_pions_electrons_rejection_pim.pdf"); + + TCanvas *c8 = new TCanvas("c8", "c8", 700, 500); + //c6->SetLogy(1); + hEpvp_ele->GetYaxis()->SetTitleOffset(1.4); + hEpvp_ele->DrawClone("COLZ"); + c8->SaveAs("results/emcal_barrel_pions_electrons_Epvp_ele.png"); + c8->SaveAs("results/emcal_barrel_pions_electrons_Epvp_ele.pdf"); + + TCanvas *c9 = new TCanvas("c9", "c9", 700, 500); + //c6->SetLogy(1); + hEpvp_pim->GetYaxis()->SetTitleOffset(1.4); + hEpvp_pim->DrawClone("COLZ"); + c9->SaveAs("results/emcal_barrel_pions_electrons_Epvp_pim.png"); + c9->SaveAs("results/emcal_barrel_pions_electrons_Epvp_pim.pdf"); + +} diff --git a/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_reader.cxx b/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_reader.cxx new file mode 100644 index 0000000000000000000000000000000000000000..a5536ad3694dfd0ba8d5df89d5ab5602f1695545 --- /dev/null +++ b/benchmarks/barrel_ecal/scripts/emcal_barrel_pions_electrons_reader.cxx @@ -0,0 +1,125 @@ +////////////////////////////////////////////////////////////// +// EMCAL Barrel detector +// Electron & Pion Minus dataset +// M. Scott 05/2021 +////////////////////////////////////////////////////////////// +#include "HepMC3/GenEvent.h" +#include "HepMC3/Print.h" +#include "HepMC3/ReaderAscii.h" +#include "HepMC3/WriterAscii.h" + +#include "TH1F.h" +#include "TStyle.h" +#include <iostream> + +using namespace HepMC3; + +void emcal_barrel_pions_electrons_reader(double e_start = 0.0, double e_end = 30.0, const char* in_fname = "./data/emcal_barrel_uniform_pions_electrons.hepmc") { + // Setting for graphs + gROOT->SetStyle("Plain"); + gStyle->SetOptFit(1); + gStyle->SetLineWidth(1); + gStyle->SetPadTickX(1); + gStyle->SetPadTickY(1); + gStyle->SetPadGridX(1); + gStyle->SetPadGridY(1); + gStyle->SetPadLeftMargin(0.14); + gStyle->SetPadRightMargin(0.17); + + ReaderAscii hepmc_input(in_fname); + int events_parsed = 0; + GenEvent evt(Units::GEV, Units::MM); + + // Histograms + TH1F* h_pions_electrons_energy = new TH1F("h_pions_electrons_energy", "pion energy;E [GeV];Events", 100, -0.5, 30.5); + TH1F* h_pions_electrons_eta = new TH1F("h_pions_electrons_eta", "pion #eta;#eta;Events", 100, -10.0, 10.0); + TH1F* h_pions_electrons_theta = new TH1F("h_pions_electrons_theta", "pion #theta;#theta [degree];Events", 100, -0.5, 180.5); + TH1F* h_pions_electrons_phi = new TH1F("h_pions_electrons_phi", "pion #phi;#phi [degree];Events", 100, -180.5, 180.5); + TH2F* h_pions_electrons_pzpt = new TH2F("h_pions_electrons_pzpt", "pion pt vs pz;pt [GeV];pz [GeV]", 100, -0.5, 30.5, 100, -30.5, 30.5); + TH2F* h_pions_electrons_pxpy = new TH2F("h_pions_electrons_pxpy", "pion px vs py;px [GeV];py [GeV]", 100, -30.5, 30.5, 100, -30.5, 30.5); + TH3F* h_pions_electrons_p = new TH3F("h_pions_electrons_p", "pion p;px [GeV];py [GeV];pz [GeV]", 100, -30.5, 30.5, 100, -30.5, 30.5, 100, -30.5, 30.5); + + while (!hepmc_input.failed()) { + // Read event from input file + hepmc_input.read_event(evt); + // If reading failed - exit loop + if (hepmc_input.failed()) + break; + + for (const auto& v : evt.vertices()) { + for (const auto& p : v->particles_out()) { + if (p->pid() == 11) { + h_pions_electrons_energy->Fill(p->momentum().e()); + h_pions_electrons_eta->Fill(p->momentum().eta()); + h_pions_electrons_theta->Fill(p->momentum().theta() * TMath::RadToDeg()); + h_pions_electrons_phi->Fill(p->momentum().phi() * TMath::RadToDeg()); + h_pions_electrons_pzpt->Fill(TMath::Sqrt(p->momentum().px() * p->momentum().px() + p->momentum().py() * p->momentum().py()), p->momentum().pz()); + h_pions_electrons_pxpy->Fill(p->momentum().px(), p->momentum().py()); + h_pions_electrons_p->Fill(p->momentum().px(), p->momentum().py(), p->momentum().pz()); + } + } + } + evt.clear(); + events_parsed++; + } + std::cout << "Events parsed and written: " << events_parsed << std::endl; + + TCanvas* c = new TCanvas("c", "c", 500, 500); + h_pions_electrons_energy->GetYaxis()->SetTitleOffset(1.8); + h_pions_electrons_energy->SetLineWidth(2); + h_pions_electrons_energy->SetLineColor(kBlue); + h_pions_electrons_energy->DrawClone(); + c->SaveAs("results/input_emcal_barrel_pions_electrons_energy.png"); + c->SaveAs("results/input_emcal_barrel_pions_electrons_energy.pdf"); + + TCanvas* c1 = new TCanvas("c1", "c1", 500, 500); + h_pions_electrons_eta->GetYaxis()->SetTitleOffset(1.9); + h_pions_electrons_eta->SetLineWidth(2); + h_pions_electrons_eta->SetLineColor(kBlue); + h_pions_electrons_eta->DrawClone(); + c1->SaveAs("results/input_emcal_barrel_pions_electrons_eta.png"); + c1->SaveAs("results/input_emcal_barrel_pions_electrons_eta.pdf"); + + TCanvas* c2 = new TCanvas("c2", "c2", 500, 500); + h_pions_electrons_theta->GetYaxis()->SetTitleOffset(1.8); + h_pions_electrons_theta->SetLineWidth(2); + h_pions_electrons_theta->SetLineColor(kBlue); + h_pions_electrons_theta->DrawClone(); + c2->SaveAs("results/input_emcal_barrel_pions_electrons_theta.png"); + c2->SaveAs("results/input_emcal_barrel_pions_electrons_theta.pdf"); + + TCanvas* c3 = new TCanvas("c3", "c3", 500, 500); + h_pions_electrons_phi->GetYaxis()->SetTitleOffset(1.8); + h_pions_electrons_phi->SetLineWidth(2); + h_pions_electrons_phi->GetYaxis()->SetRangeUser(0.0, h_pions_electrons_phi->GetMaximum() + 100.0); + h_pions_electrons_phi->SetLineColor(kBlue); + h_pions_electrons_phi->DrawClone(); + c3->SaveAs("results/input_emcal_barrel_pions_electrons_phi.png"); + c3->SaveAs("results/input_emcal_barrel_pions_electrons_phi.pdf"); + + TCanvas* c4 = new TCanvas("c4", "c4", 500, 500); + h_pions_electrons_pzpt->GetYaxis()->SetTitleOffset(1.4); + h_pions_electrons_pzpt->SetLineWidth(2); + h_pions_electrons_pzpt->SetLineColor(kBlue); + h_pions_electrons_pzpt->DrawClone("COLZ"); + c4->SaveAs("results/input_emcal_barrel_pions_electrons_pzpt.png"); + c4->SaveAs("results/input_emcal_barrel_pions_electrons_pzpt.pdf"); + + TCanvas* c5 = new TCanvas("c5", "c5", 500, 500); + h_pions_electrons_pxpy->GetYaxis()->SetTitleOffset(1.4); + h_pions_electrons_pxpy->SetLineWidth(2); + h_pions_electrons_pxpy->SetLineColor(kBlue); + h_pions_electrons_pxpy->DrawClone("COLZ"); + c5->SaveAs("results/input_emcal_barrel_pions_electrons_pxpy.png"); + c5->SaveAs("results/input_emcal_barrel_pions_electrons_pxpy.pdf"); + + TCanvas* c6 = new TCanvas("c6", "c6", 500, 500); + h_pions_electrons_p->GetYaxis()->SetTitleOffset(1.8); + h_pions_electrons_p->GetXaxis()->SetTitleOffset(1.6); + h_pions_electrons_p->GetZaxis()->SetTitleOffset(1.6); + h_pions_electrons_p->SetLineWidth(2); + h_pions_electrons_p->SetLineColor(kBlue); + h_pions_electrons_p->DrawClone(); + c6->SaveAs("results/input_emcal_barrel_pions_electrons_p.png"); + c6->SaveAs("results/input_emcal_barrel_pions_electrons_p.pdf"); +}