From 6cee82c19ccc81ad619f40a5d2a63aa07c0f04b7 Mon Sep 17 00:00:00 2001
From: "jihee.kim" <jihee.kim@anl.gov>
Date: Sun, 4 Apr 2021 21:08:11 -0500
Subject: [PATCH] Added scripts to generate pion dataset

---
 calorimeters/calorimeters_config.yml          |  14 ++
 calorimeters/run_emcal_barrel_pions.sh        |  47 +++++++
 calorimeters/scripts/emcal_barrel_pions.cxx   |  80 +++++++++++
 .../scripts/emcal_barrel_pions_reader.cxx     | 125 ++++++++++++++++++
 4 files changed, 266 insertions(+)
 create mode 100755 calorimeters/run_emcal_barrel_pions.sh
 create mode 100644 calorimeters/scripts/emcal_barrel_pions.cxx
 create mode 100644 calorimeters/scripts/emcal_barrel_pions_reader.cxx

diff --git a/calorimeters/calorimeters_config.yml b/calorimeters/calorimeters_config.yml
index c6e1d5d7..0665ec56 100644
--- a/calorimeters/calorimeters_config.yml
+++ b/calorimeters/calorimeters_config.yml
@@ -5,6 +5,20 @@
 # - Run Juggler
 #####################
 
+sim_emcal_barrel_pions:
+  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
+  stage: simulate
+  tags:
+    - silicon
+  artifacts:
+    expire_in: 20 weeks
+    paths:
+      - results/
+      - sim_output/
+  script:
+    - bash calorimeters/run_emcal_barrel_pions.sh
+  allow_failure: true
+
 sim_emcal_barrel_electrons:
   image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
   stage: simulate
diff --git a/calorimeters/run_emcal_barrel_pions.sh b/calorimeters/run_emcal_barrel_pions.sh
new file mode 100755
index 00000000..fd399640
--- /dev/null
+++ b/calorimeters/run_emcal_barrel_pions.sh
@@ -0,0 +1,47 @@
+#!/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"
+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 "calorimeters/scripts/emcal_barrel_pions.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 "calorimeters/scripts/emcal_barrel_pions_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
+
+# Directory for plots
+mkdir -p results
+
diff --git a/calorimeters/scripts/emcal_barrel_pions.cxx b/calorimeters/scripts/emcal_barrel_pions.cxx
new file mode 100644
index 00000000..02537b56
--- /dev/null
+++ b/calorimeters/scripts/emcal_barrel_pions.cxx
@@ -0,0 +1,80 @@
+//////////////////////////////////////////////////////////////
+// EMCAL Barrel detector
+// Single Pion dataset
+// J.KIM 04/04/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(int n_events = 1e6, double e_start = 0.0, double e_end = 30.0, const char* out_fname = "./data/emcal_barrel_pions.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
+    GenParticlePtr p3 = std::make_shared<GenParticle>(FourVector(px, py, pz, sqrt(p * p + (0.139570 * 0.139570))), 211, 1);
+
+    GenVertexPtr v1 = std::make_shared<GenVertex>();
+    v1->add_particle_in(p1);
+    v1->add_particle_in(p2);
+
+    v1->add_particle_out(p3);
+    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/calorimeters/scripts/emcal_barrel_pions_reader.cxx b/calorimeters/scripts/emcal_barrel_pions_reader.cxx
new file mode 100644
index 00000000..e0377148
--- /dev/null
+++ b/calorimeters/scripts/emcal_barrel_pions_reader.cxx
@@ -0,0 +1,125 @@
+//////////////////////////
+// EMCAL Barrel detector
+// Pion dataset
+// J.KIM 04/04/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_reader(double e_start = 0.0, double e_end = 30.0, const char* in_fname = "./data/emcal_barrel_pions.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_energy = new TH1F("h_pions_energy", "pion energy;E [GeV];Events",         100, -0.5, 30.5);
+  TH1F* h_pions_eta    = new TH1F("h_pions_eta",    "pion #eta;#eta;Events",              100, -10.0, 10.0);
+  TH1F* h_pions_theta  = new TH1F("h_pions_theta",  "pion #theta;#theta [degree];Events", 100, -0.5, 180.5);
+  TH1F* h_pions_phi    = new TH1F("h_pions_phi",    "pion #phi;#phi [degree];Events",     100, -180.5, 180.5);
+  TH2F* h_pions_pzpt   = new TH2F("h_pions_pzpt",   "pion pt vs pz;pt [GeV];pz [GeV]",    100, -0.5, 30.5, 100, -30.5, 30.5);
+  TH2F* h_pions_pxpy   = new TH2F("h_pions_pxpy",   "pion px vs py;px [GeV];py [GeV]",    100, -30.5, 30.5, 100, -30.5, 30.5);
+  TH3F* h_pions_p      = new TH3F("h_pions_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_energy->Fill(p->momentum().e());
+          h_pions_eta->Fill(p->momentum().eta());
+          h_pions_theta->Fill(p->momentum().theta() * TMath::RadToDeg());
+          h_pions_phi->Fill(p->momentum().phi() * TMath::RadToDeg());
+          h_pions_pzpt->Fill(TMath::Sqrt(p->momentum().px() * p->momentum().px() + p->momentum().py() * p->momentum().py()), p->momentum().pz());
+          h_pions_pxpy->Fill(p->momentum().px(), p->momentum().py());
+          h_pions_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_energy->GetYaxis()->SetTitleOffset(1.8);
+  h_pions_energy->SetLineWidth(2);
+  h_pions_energy->SetLineColor(kBlue);
+  h_pions_energy->DrawClone();
+  c->SaveAs("results/input_emcal_barrel_pions_energy.png");
+  c->SaveAs("results/input_emcal_barrel_pions_energy.pdf");
+
+  TCanvas* c1 = new TCanvas("c1", "c1", 500, 500);
+  h_pions_eta->GetYaxis()->SetTitleOffset(1.9);
+  h_pions_eta->SetLineWidth(2);
+  h_pions_eta->SetLineColor(kBlue);
+  h_pions_eta->DrawClone();
+  c1->SaveAs("results/input_emcal_barrel_pions_eta.png");
+  c1->SaveAs("results/input_emcal_barrel_pions_eta.pdf");
+
+  TCanvas* c2 = new TCanvas("c2", "c2", 500, 500);
+  h_pions_theta->GetYaxis()->SetTitleOffset(1.8);
+  h_pions_theta->SetLineWidth(2);
+  h_pions_theta->SetLineColor(kBlue);
+  h_pions_theta->DrawClone();
+  c2->SaveAs("results/input_emcal_barrel_pions_theta.png");
+  c2->SaveAs("results/input_emcal_barrel_pions_theta.pdf");
+
+  TCanvas* c3 = new TCanvas("c3", "c3", 500, 500);
+  h_pions_phi->GetYaxis()->SetTitleOffset(1.8);
+  h_pions_phi->SetLineWidth(2);
+  h_pions_phi->GetYaxis()->SetRangeUser(0.0, h_pions_phi->GetMaximum() + 100.0);
+  h_pions_phi->SetLineColor(kBlue);
+  h_pions_phi->DrawClone();
+  c3->SaveAs("results/input_emcal_barrel_pions_phi.png");
+  c3->SaveAs("results/input_emcal_barrel_pions_phi.pdf");
+
+  TCanvas* c4 = new TCanvas("c4", "c4", 500, 500);
+  h_pions_pzpt->GetYaxis()->SetTitleOffset(1.4);
+  h_pions_pzpt->SetLineWidth(2);
+  h_pions_pzpt->SetLineColor(kBlue);
+  h_pions_pzpt->DrawClone("COLZ");
+  c4->SaveAs("results/input_emcal_barrel_pions_pzpt.png");
+  c4->SaveAs("results/input_emcal_barrel_pions_pzpt.pdf");
+
+  TCanvas* c5 = new TCanvas("c5", "c5", 500, 500);
+  h_pions_pxpy->GetYaxis()->SetTitleOffset(1.4);
+  h_pions_pxpy->SetLineWidth(2);
+  h_pions_pxpy->SetLineColor(kBlue);
+  h_pions_pxpy->DrawClone("COLZ");
+  c5->SaveAs("results/input_emcal_barrel_pions_pxpy.png");
+  c5->SaveAs("results/input_emcal_barrel_pions_pxpy.pdf");
+
+  TCanvas* c6 = new TCanvas("c6", "c6", 500, 500);
+  h_pions_p->GetYaxis()->SetTitleOffset(1.8);
+  h_pions_p->GetXaxis()->SetTitleOffset(1.6);
+  h_pions_p->GetZaxis()->SetTitleOffset(1.6);
+  h_pions_p->SetLineWidth(2);
+  h_pions_p->SetLineColor(kBlue);
+  h_pions_p->DrawClone();
+  c6->SaveAs("results/input_emcal_barrel_pions_p.png");
+  c6->SaveAs("results/input_emcal_barrel_pions_p.pdf");
+}
-- 
GitLab