123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- #!/usr/bin/env python
- import numpy as np
- import matplotlib.pyplot as plt
- from filval.result_set import ResultSet
- from filval.histogram import hist, hist_add, hist_norm, hist_scale, hist2d
- from filval.plotting import (decl_plot, render_plots, hist_plot, hist2d_plot,
- Plot, generate_dashboard, simple_plot)
- def center_text(x, y, txt, **kwargs):
- plt.text(x, y, txt,
- horizontalalignment='center', verticalalignment='center',
- transform=plt.gca().transAxes, **kwargs)
- @decl_plot
- def plot_residuals(rs, layer, hit, variable, subdet, plot_cuts=True):
- matching_cuts = [
- dict(
- dPhiMaxHighEt=0.05,
- dPhiMaxHighEtThres=20.0,
- dPhiMaxLowEtGrad=-0.002,
- dRzMaxHighEt=9999.0,
- dRzMaxHighEtThres=0.0,
- dRzMaxLowEtGrad=0.0,
- ),
- dict(
- dPhiMaxHighEt=0.003,
- dPhiMaxHighEtThres=0.0,
- dPhiMaxLowEtGrad=0.0,
- dRzMaxHighEt=0.05,
- dRzMaxHighEtThres=30.0,
- dRzMaxLowEtGrad=-0.002,
- ),
- dict(
- dPhiMaxHighEt=0.003,
- dPhiMaxHighEtThres=0.0,
- dPhiMaxLowEtGrad=0.0,
- dRzMaxHighEt=0.05,
- dRzMaxHighEtThres=30.0,
- dRzMaxLowEtGrad=-0.002,
- )
- ]
- h = hist2d(getattr(rs, f'{variable}_{subdet}_L{layer}_H{hit}_v_Et'))
- def calc_window(et):
- idx = min(hit-1, 2)
- high_et = matching_cuts[idx][f'{variable}MaxHighEt']
- high_et_thres = matching_cuts[idx][f'{variable}MaxHighEtThres']
- low_et_grad = matching_cuts[idx][f'{variable}MaxLowEtGrad']
- return high_et + min(0, et-high_et_thres)*low_et_grad
- hist2d_plot(h, colorbar=True)
- if plot_cuts:
- ets = h[3][:, 0]
- cuts = [calc_window(et) for et in ets]
- plt.plot(cuts, ets, color='red', label='Cut Value')
- plt.legend()
- plt.xlabel({'dPhi': r'$\delta \phi$ (rads)',
- 'dRz': r'$\delta R/z$ (cm)'}[variable])
- plt.ylabel('$E_T$ (GeV)')
- @decl_plot
- def plot_seed_eff(rs):
- r"""## ECAL-Driven Seeding Efficiency
- The proportion of gen-level electrons originating in the luminous region that have
- an associated Seed, matched via rechit-simhit associations in the pixel detector. Cuts are on simtrack quantities.
- """
- ax_pt = plt.subplot(221)
- ax_eta = plt.subplot(222)
- ax_phi = plt.subplot(223)
- errors = True
- plt.sca(ax_pt)
- hist_plot(hist(rs.seed_eff_v_pt), include_errors=errors)
- center_text(0.5, 0.3, r'$|\eta|<2.4$')
- plt.xlabel(r"Sim-Track $p_T$")
- plt.ylim((0, 1.1))
- plt.sca(ax_eta)
- hist_plot(hist(rs.seed_eff_v_eta), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$')
- plt.xlabel(r"Sim-Track $\eta$")
- plt.ylim((0, 1.1))
- plt.sca(ax_phi)
- hist_plot(hist(rs.seed_eff_v_phi), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
- plt.xlabel(r"Sim-Track $\phi$")
- plt.ylim((0, 1.1))
- @decl_plot
- def plot_tracking_eff(rs):
- r"""## GSF Tracking Efficiency
- The proportion of electrons origination in the luminous region from the that have
- an associated GSF track. Cuts are on simtrack quantities.
- """
- ax_pt = plt.subplot(221)
- ax_eta = plt.subplot(222)
- ax_phi = plt.subplot(223)
- errors = True
- plt.sca(ax_pt)
- hist_plot(hist(rs.tracking_eff_v_pt), include_errors=errors)
- center_text(0.5, 0.3, r'$|\eta|<2.4$')
- plt.xlabel(r"Sim-Track $p_T$")
- plt.ylim((0, 1.1))
- plt.sca(ax_eta)
- hist_plot(hist(rs.tracking_eff_v_eta), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$')
- plt.xlabel(r"Sim-Track $\eta$")
- plt.ylim((0, 1.1))
- plt.sca(ax_phi)
- hist_plot(hist(rs.tracking_eff_v_phi), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
- plt.xlabel(r"Sim-Track $\phi$")
- plt.ylim((0, 1.1))
- @decl_plot
- def plot_seed_purity(rs, ext=""):
- r"""## ECAL-Driven Seed Purity
- The proportion of ECAL-driven seeds that have a matched gen-level electron originating in
- the luminous region. Cuts are on seed quantities.
- """
- ax_pt = plt.subplot(221)
- ax_eta = plt.subplot(222)
- ax_phi = plt.subplot(223)
- def get_hist(base_name):
- return hist(getattr(rs, base_name+ext))
- errors = True
- plt.sca(ax_pt)
- hist_plot(get_hist("seed_pur_v_pt"), include_errors=errors)
- center_text(0.5, 0.3, r'$|\eta|<2.4$')
- plt.xlabel(r"Seed $p_T$")
- if not ext:
- plt.ylim((0, 1.1))
- plt.sca(ax_eta)
- hist_plot(get_hist("seed_pur_v_eta"), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$')
- plt.xlabel(r"Seed $\eta$")
- if not ext:
- plt.ylim((0, 1.1))
- plt.sca(ax_phi)
- hist_plot(get_hist("seed_pur_v_phi"), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
- plt.xlabel(r"Seed $\phi$")
- if not ext:
- plt.ylim((0, 1.1))
- @decl_plot
- def plot_track_purity(rs, ext=""):
- r"""## GSF Track Purity
- The proportion of GSF-tracks w\ ECAL-driven seeds that have a matched gen-level electron originating in
- the luminous region. Cuts are on GSF track quantities.
- """
- ax_pt = plt.subplot(221)
- ax_eta = plt.subplot(222)
- ax_phi = plt.subplot(223)
- def get_hist( base_name):
- return hist(getattr(rs, base_name+ext))
- errors = True
- plt.sca(ax_pt)
- hist_plot(get_hist("tracking_pur_v_pt"), include_errors=errors)
- center_text(0.5, 0.3, r'$|\eta|<2.4$')
- plt.xlabel(r"GSF-Track $p_T$")
- if not ext:
- plt.ylim((0, 1.1))
- plt.sca(ax_eta)
- hist_plot(get_hist("tracking_pur_v_eta"), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$')
- plt.xlabel(r"GSF-Track $\eta$")
- if not ext:
- plt.ylim((0, 1.1))
- plt.sca(ax_phi)
- hist_plot(get_hist("tracking_pur_v_phi"), include_errors=errors)
- center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
- plt.xlabel(r"GSF-Track $\phi$")
- if not ext:
- plt.ylim((0, 1.1))
- @decl_plot
- def plot_hit_vs_layer(rs, region):
- h = hist2d(getattr(rs, f'hit_vs_layer_{region}'))
- hist2d_plot(h, txt_format='{:2.0f}')
- plt.xlabel('Layer \#')
- plt.ylabel('Hit \#')
- if __name__ == '__main__':
- rs = ResultSet('seeds', '../hists/new_seeding.root')
- # Next, declare all of the (sub)plots that will be assembled into full
- # figures later
- seed_eff = plot_seed_eff, (rs, )
- tracking_eff = plot_tracking_eff, (rs,)
- seed_pur = plot_seed_purity, rs
- seed_pur_num = plot_seed_purity, (rs,), {'ext': '_num'}
- seed_pur_den = plot_seed_purity, (rs,), {'ext': '_den'}
- track_pur = plot_track_purity, (rs,)
- track_pur_num = plot_track_purity, (rs,), {'ext': '_num'}
- track_pur_den = plot_track_purity, (rs,), {'ext': '_den'}
- BPIX_residuals_L1_H1_dPhi = plot_residuals, (rs, 1, 1, 'dPhi', 'BPIX')
- BPIX_residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi', 'BPIX')
- BPIX_residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi', 'BPIX')
- BPIX_residuals_L1_H1_dRz = plot_residuals, (rs, 1, 1, 'dRz', 'BPIX'), {'plot_cuts': False}
- BPIX_residuals_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz', 'BPIX')
- BPIX_residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz', 'BPIX')
- FPIX_residuals_L1_H1_dPhi = plot_residuals, (rs, 1, 1, 'dPhi', 'FPIX')
- FPIX_residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi', 'FPIX')
- FPIX_residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi', 'FPIX')
- FPIX_residuals_L1_H1_dRz = plot_residuals, (rs, 1, 1, 'dRz', 'FPIX'), {'plot_cuts': False}
- FPIX_residuals_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz', 'FPIX')
- FPIX_residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz', 'FPIX')
- FPIX_residuals_L1_H2_dPhi = plot_residuals, (rs, 1, 2, 'dPhi', 'FPIX')
- FPIX_residuals_L1_H3_dPhi = plot_residuals, (rs, 1, 3, 'dPhi', 'FPIX')
- FPIX_residuals_L2_H3_dPhi = plot_residuals, (rs, 2, 3, 'dPhi', 'FPIX')
- FPIX_residuals_L1_H2_dRz = plot_residuals, (rs, 1, 2, 'dPhi', 'FPIX')
- FPIX_residuals_L1_H3_dRz = plot_residuals, (rs, 1, 3, 'dPhi', 'FPIX')
- FPIX_residuals_L2_H3_dRz = plot_residuals, (rs, 2, 3, 'dPhi', 'FPIX')
- hit_vs_layer_barrel = plot_hit_vs_layer, (rs, 'barrel')
- hit_vs_layer_forward = plot_hit_vs_layer, (rs, 'forward')
- # Now assemble the plots into figures.
- plots = [
- Plot(BPIX_residuals_L1_H1_dPhi, 'Phi Residuals Layer 1 Hit 1 - BPIX'),
- Plot(BPIX_residuals_L2_H2_dPhi, 'Phi Residuals Layer 2 Hit 2 - BPIX'),
- Plot(BPIX_residuals_L3_H3_dPhi, 'Phi Residuals Layer 3 Hit 3 - BPIX'),
- Plot(BPIX_residuals_L1_H1_dRz, 'dZ Residuals Layer 1 Hit 1 w/o cuts - BPIX'),
- Plot(BPIX_residuals_L2_H2_dRz, 'dZ Residuals Layer 2 Hit 2 - BPIX'),
- Plot(BPIX_residuals_L3_H3_dRz, 'dZ Residuals Layer 3 Hit 3 - BPIX'),
- Plot(FPIX_residuals_L1_H1_dPhi, 'Phi Residuals Layer 1 Hit 1 - FPIX'),
- Plot(FPIX_residuals_L2_H2_dPhi, 'Phi Residuals Layer 2 Hit 2 - FPIX'),
- Plot(FPIX_residuals_L3_H3_dPhi, 'Phi Residuals Layer 3 Hit 3 - FPIX'),
- Plot(FPIX_residuals_L1_H1_dRz, 'dR Residuals Layer 1 Hit 1 w/o cuts - FPIX'),
- Plot(FPIX_residuals_L2_H2_dRz, 'dR Residuals Layer 2 Hit 2 - FPIX'),
- Plot(FPIX_residuals_L3_H3_dRz, 'dR Residuals Layer 3 Hit 3 - FPIX'),
- Plot(FPIX_residuals_L1_H2_dPhi, 'Phi Residuals Layer 1 Hit 2 - FPIX'),
- Plot(FPIX_residuals_L1_H3_dPhi, 'Phi Residuals Layer 1 Hit 3 - FPIX'),
- Plot(FPIX_residuals_L2_H3_dPhi, 'Phi Residuals Layer 2 Hit 3 - FPIX'),
- Plot(FPIX_residuals_L1_H2_dRz, 'dR Residuals Layer 1 Hit 2 - FPIX'),
- Plot(FPIX_residuals_L1_H3_dRz, 'dR Residuals Layer 1 Hit 3 - FPIX'),
- Plot(FPIX_residuals_L2_H3_dRz, 'dR Residuals Layer 2 Hit 3 - FPIX'),
- Plot(seed_eff, 'ECAL-Driven Seeding Efficiency'),
- Plot(tracking_eff, 'GSF Tracking Efficiency'),
- Plot(hit_vs_layer_barrel, 'Hit vs Layer - Barrel'),
- Plot(hit_vs_layer_forward, 'Hit vs Layer - Forward'),
- Plot(track_pur, 'GSF Track Purity'),
- Plot(track_pur_num, 'GSF Track Purity Numerator'),
- Plot(track_pur_den, 'GSF Track Purity Denominator'),
- ]
- # Finally, render and save the plots and generate the html+bootstrap
- # dashboard to view them
- render_plots(plots, to_disk=False)
- generate_dashboard(plots, 'Seeding Efficiency',
- output='eff_plots.html',
- source=__file__,
- config=rs.config)
|