Skip to content
Snippets Groups Projects

Add plot script for e/pi separation performance

Open Chao Peng requested to merge update_imaging_ml_benchmarks into master
Files
5
"""
A script to draw imaging events in 3D
Assumed the input reconstruction file has only single-particle events
Chao Peng (ANL)
2022/12/06
"""
import ROOT
import os
import gc
import sys
import json
import numpy as np
import pandas as pd
import argparse
from utils import flatten_collection, cartesian_to_polar, imcal_info, center_of_gravity
pd.set_option('display.max_rows', 500)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Visualize the cluster (layer-wise) from analysis')
parser.add_argument(
'file', type=str,
help='path to the input file.'
)
parser.add_argument(
'-o', type=str,
default='.',
dest='outdir',
help='output directory.'
)
parser.add_argument(
'-e', type=int,
default=0,
dest='event',
help='event number to draw.'
)
parser.add_argument(
'--nhits', type=int,
default=50,
dest='nhits',
help='number of hits per layer.'
)
parser.add_argument(
'-b', '--branch', type=str,
dest='branch',
default='EcalBarrelImagingHitsReco',
help='name of data branch (edm4eic::CalorimeterHitCollection).'
)
parser.add_argument(
'--eta-ngrid', type=int,
dest='eta_ngrid',
default=40,
help='number of eta grids for drawing.')
parser.add_argument(
'--eta-grid', type=float,
dest='eta_grid',
default=0.01,
help='eta grid size for drawing.')
parser.add_argument(
'--phi-ngrid', type=int,
dest='phi_ngrid',
default=40,
help='number of phi grids for drawing.')
parser.add_argument(
'--phi-grid', type=float,
dest='phi_grid',
default=0.01,
help='phi grid size for drawing (rad).')
parser.add_argument('--topo-range', type=float, default=50.0, dest='topo_range',
help='half range for projection plot (mrad)')
args = parser.parse_args()
# read data and MCParticles
rdf = ROOT.RDataFrame("events", args.file)
# event range
ntotal = rdf.Count().GetValue()
iev = int(np.clip(args.event, 0, ntotal))
# data
data = flatten_collection(rdf, args.branch, (iev, iev + 1), cols=[
'layer',
'energy',
'position.x', 'position.y', 'position.z',
])
etot = data['energy'].sum()
xc, yc, zc = center_of_gravity(*data[['position.x', 'position.y', 'position.z']].values.T,
np.log(data['energy'].values/etot), 4.6)
rc, thetac, phic, r0c, etac = cartesian_to_polar(xc, yc, zc)
r, theta, phi, rc, eta = cartesian_to_polar(*data[['position.x', 'position.y', 'position.z']].values.T)
dfg = pd.DataFrame(data=np.vstack((*data[['layer', 'energy']].values.T, eta, phi)).T,
columns=['layer', 'energy', 'eta', 'phi'])
eta_bins = np.arange(args.eta_ngrid + 1)*args.eta_grid
eta_bins = eta_bins - eta_bins[-1]/2. + etac
phi_bins = np.arange(args.phi_ngrid + 1)*args.phi_grid
phi_bins = phi_bins - phi_bins[-1]/2. + phic
dfg.loc[:, 'eta_bin'] = np.digitize(dfg['eta'], eta_bins)
dfg.loc[:, 'phi_bin'] = np.digitize(dfg['phi'], phi_bins)
print(dfg)
# eta = eta - etac
# phi = phi - phic
# determine eta and phi windows according to event (cluster) center
Loading