From 3bc0da103456e7a0e04b97a6c292d27b9a56c89c Mon Sep 17 00:00:00 2001
From: Christopher Dilks <c-dilks@users.noreply.github.com>
Date: Wed, 7 Jun 2023 19:37:00 -0400
Subject: [PATCH] feat: draw plots to PNGs

---
 benchmarks/rich/draw_benchmark.py | 112 ++++++++++++++++++++++++++++++
 benchmarks/rich/run_benchmark.rb  |  11 ++-
 2 files changed, 122 insertions(+), 1 deletion(-)
 create mode 100755 benchmarks/rich/draw_benchmark.py

diff --git a/benchmarks/rich/draw_benchmark.py b/benchmarks/rich/draw_benchmark.py
new file mode 100755
index 00000000..8d1711b3
--- /dev/null
+++ b/benchmarks/rich/draw_benchmark.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+# Copyright 2023, Christopher Dilks
+# Subject to the terms in the LICENSE file found in the top-level directory.
+
+import ROOT as r
+import sys, getopt, pathlib
+
+# suppress graphics
+r.gROOT.SetBatch(True)
+
+# ARGUMENTS
+################################################################
+
+ana_file_name = 'out/ana.edm4hep.root'
+output_dir    = 'out/ana_plots'
+
+helpStr = f'''
+{sys.argv[0]} [OPTIONS]
+
+    -i <input file>: specify an input file, e.g., hepmc
+       default: {ana_file_name}
+
+    -o <output dir>: specify an output directory
+       default: {output_dir}
+    
+    -h: show this usage guide
+
+    '''
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:], 'i:o:h')
+except getopt.GetoptError:
+    print('\n\nERROR: invalid argument\n', helpStr, file=sys.stderr)
+    sys.exit(2)
+for opt, arg in opts:
+    if(opt == '-i'): ana_file_name = arg.lstrip()
+    if(opt == '-o'): output_dir    = arg.lstrip()
+    if(opt == '-h'):
+        print(helpStr)
+        sys.exit(2)
+print(f'''
+ana_file_name = {ana_file_name}
+output_dir    = {output_dir}
+''')
+
+
+# PLOTTING
+################################################################
+
+# make canvases
+ana_file = r.TFile.Open(ana_file_name, "READ")
+def make_canv(name, dimx=1200, dimy=800):
+    return r.TCanvas(name, name, dimx, dimy)
+canv_dict = {
+    "photon_spectra": make_canv("photon_spectra"),
+    "digitization":   make_canv("digitization"),
+    "pidAerogel":     make_canv("pidAerogel"),
+    "pidGas":         make_canv("pidGas"),
+    "pidMerged":      make_canv("pidMerged"),
+}
+
+# draw photon spectra
+canv = canv_dict["photon_spectra"]
+canv.Divide(1,2)
+for i in range(2):
+    canv.GetPad(i+1).SetGrid(1,1)
+    canv.GetPad(i+1).SetLogy()
+canv.cd(1)
+ana_file.Get("phot/phot_spectrum_sim").Draw()
+canv.cd(2)
+ana_file.Get("digi/phot_spectrum_rec").Draw()
+
+# draw digitization
+canv = canv_dict["digitization"]
+canv.Divide(2,2)
+for i in range(4):
+    canv.GetPad(i+1).SetGrid(1,1)
+    if(i<2):
+        canv.GetPad(i+1).SetLogy()
+    else:
+        canv.GetPad(i+1).SetLogz()
+canv.cd(1)
+ana_file.Get("digi/adc_dist").Draw()
+canv.cd(2)
+ana_file.Get("digi/tdc_dist").Draw()
+canv.cd(3)
+ana_file.Get("digi/tdc_vs_adc").Draw("COLZ")
+
+# draw CherenkovPID
+for rad in ["Aerogel", "Gas", "Merged"]:
+    pid_name = f'pid{rad}'
+    canv = canv_dict[pid_name]
+    canv.Divide(2,2)
+    for i in range(4):
+        canv.GetPad(i+1).SetGrid(1,1)
+    canv.cd(1)
+    ana_file.Get(f'{pid_name}/npe_dist_{rad}').Draw()
+    canv.cd(2)
+    ana_file.Get(f'{pid_name}/theta_dist_{rad}').Draw()
+    canv.cd(3)
+    ana_file.Get(f'{pid_name}/thetaResid_dist_{rad}').Draw()
+    canv.cd(4)
+    ana_file.Get(f'{pid_name}/highestWeight_dist_{rad}').Draw()
+
+
+# FINISH
+################################################################
+
+pathlib.Path(output_dir).mkdir(parents=True, exist_ok=True)
+for name, canvas in canv_dict.items():
+    canvas.SaveAs(f'{output_dir}/{name}.png')
+ana_file.Close()
diff --git a/benchmarks/rich/run_benchmark.rb b/benchmarks/rich/run_benchmark.rb
index f93c05d7..0a1a748e 100755
--- a/benchmarks/rich/run_benchmark.rb
+++ b/benchmarks/rich/run_benchmark.rb
@@ -1,4 +1,4 @@
-#!/usr/bin/ruby
+#!/usr/bin/env ruby
 # Copyright 2023, Christopher Dilks
 # Subject to the terms in the LICENSE file found in the top-level directory.
 
@@ -201,6 +201,14 @@ analysis_cmd = [
 analysis_cmd.append "-a #{opt.algos.join ' '}" if opt.algos.size > 0
 analysis_cmd.append '-' + 'v'*opt.verbosity if opt.verbosity > 0
 
+# define analysis draw command
+# ---------------------------------------------------
+draw_cmd = [
+  "#{__dir__}/draw_benchmark.py",
+  "-i #{opt.ana_file}",
+  "-o #{opt.ana_file.gsub(/edm4hep.root$/,"plots")}"
+]
+
 # execute commands
 # ---------------------------------------------------
 
@@ -229,3 +237,4 @@ puts '-'*50
 exe.call evgen_cmd,    'event generation', :sim
 exe.call recon_cmd,    'reconstruction',   :rec
 exe.call analysis_cmd, 'analysis',         :ana
+exe.call draw_cmd,     'draw',             :ana
-- 
GitLab