ATLAS Offline Software
Loading...
Searching...
No Matches
plot Namespace Reference

Classes

class  LayerPlotter
class  TqdmLoggingHandler

Functions

 check_status_code (func)
 timed (method)
 plot_ATLAS (fig, x, y, label="Internal", fontsize=20)
 pairwise (iterable)
 divide_square (n, horizontal=True)
 histo2data (histo)
 systematics_from_tool (tool, only_scale=True, only_resolution=False, only_up=True)
 partition (x, n)
 generator_photon (self)
 calibrate_eta_pt (tool, etas, pts, simulation=True, particle="unconverted")
 eval_sys_eta_phi (tool, etas, phis, pt, simulation, particle="unconverted")
 eval_eta_slice (tool, etas, pts, ptype, only_material=False, only_up=True)
 beautify_sysname (sysname)
 beautify_particle (particle)
 plot_all_syst_eta_slice (etabins, supersampling_eta=3, esmodel="es2012c", decorrelation="FULL_v1", ptype="unconverted", pts=np.logspace(np.log10(5e3), 6, 100), basedir="plot", only_material=False, beautify_sysnames=False, sys_order=None, superimpose_all=False, skip_null_sys=False, min_sys=-0.02, max_sys=0.02, only_up=True, debug=False, legend_outside=False, symmetrize_labels=False, log_x=False, plot_qsum=False, abs_sys=False, atlas_label="Internal")
 values2histo (name, title, x, y)
 plot_all_Zee_syst (etas, pt=100e3, basedir="plots")
 plot_all_syst_fixed_pt (tools, names, labels, pt=100e3, ptype="unconverted", basedir="plots")
 compute_or_read_sys (tool, ptypes, eta_edges, pt_edges)
 compare_sys (esmodels=None, ptypes=None, decorrelation="FULL_ETACORRELATED_v1", eta_edges=None, pt_edges=None, basedir="plots", smearing=False, only_up=True, abs_sys=False, log_x=False)
 plot_all_syst_eta_pt (esmodel="es2012c", decorrelation="FULL_v1", ptype="unconverted", basedir="plots", eta_range=None, pt_range=None, log_pt=False, abs_sys=False, only_up=False, sys_filters=None, min_value=None, max_value=None)
 plot_all_scales (esmodels, basedir, labels=None, etas=np.arange(-4.5, 4.5, 0.01), add_patch=False, debug=False # noqa:B008(range used as constant))
 plot_all_cterms (esmodels, basedir, labels=None, etas=np.arange(-4.5, 4.5, 0.01))
 compare_two_tools_eta (tool1, tool2, pt, simulation, name, basedir, title, particle="unconverted")
 compare_two_tools_eta_phi (tool1, tool2, pt, simulation, name, basedir, title, particle="unconverted")
 compare_two_tools_eta_pt (tool1, tool2, simulation, name, basedir, title, particle="unconverted")
 check_gain (basedir, esmodel)
 check_fast (basedir, esmodel)
 check_uniformity (basedir, esmodel)
 compare_all_syst_fixed_pt (basedir, esmodels, names=None, labels=None)
 plot_resolution_eta_pt (basedir, tool, pts, etas, ptype, title)
 plot_resolution_error (basedir, **kwargs)
 plot_resolution_error_bin (eta_min, eta_max, particle, esmodel, basedir, tool=None, **kwargs)
 list_systematics (esmodels, decorrelation="FULL_ETACORRELATED_v1")
 main ()

Variables

 IgnoreCommandLineOptions
str extensions = "pdf", "png"
 initialize
 fout = ROOT.TFile("output_plot.root", "recreate")
 log
 handler = TqdmLoggingHandler()
 plotter = LayerPlotter()

Detailed Description

Produce plots about egamma calibration systematics and corrections 

Function Documentation

◆ beautify_particle()

plot.beautify_particle ( particle)

Definition at line 286 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

286def beautify_particle(particle):
287 d = {
288 "electron": "Electrons",
289 "converted": "Converted photons",
290 "unconverted": "Unconverted photons",
291 }
292 return d.get(particle, particle).capitalize()
293
294

◆ beautify_sysname()

plot.beautify_sysname ( sysname)

Definition at line 255 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

255def beautify_sysname(sysname):
256 d = {
257 "EG_SCALE_PEDESTAL": "Pedestal",
258 "EG_SCALE_L2GAIN": "L2 gain",
259 "EG_SCALE_L1GAIN": "L1 gain",
260 "EG_SCALE_PS": r"$\alpha_{PS}$",
261 "EG_SCALE_S12": r"$\alpha_{1/2}$",
262 "EG_SCALE_S12EXTRALASTETABINRUN2": r"$\alpha_{1/2}$ [2.4-2.5]",
263 "EG_SCALE_ZEESYST": r"$Z\to ee$ cal. (sys)",
264 "EG_SCALE_ZEESTAT": r"$Z\to ee$ cal. (stat)",
265 "PH_SCALE_LEAKAGEUNCONV": "Leakage unconverted",
266 "EG_SCALE_MATID": "ID material",
267 "EG_SCALE_MATCRYO": "Cryo material",
268 "EG_SCALE_MATPP0": "PP0 material",
269 "EG_SCALE_WTOTS1": "$w_{tots1}$ non-lin.",
270 "EG_SCALE_CONVEFFICIENCY": "Conversion efficiency",
271 "EG_SCALE_MATCALO": "Calo material",
272 "EG_SCALE_ZEE_STAT": r"$Z\to ee$ (stat)",
273 "EG_SCALE_G4": "Geant4",
274 "PH_SCALE_LEAKAGECONV": "Leakage converted",
275 "PH_SCALE_CONVRADIUS": "Conv. radius",
276 "PH_SCALE_CONVFAKERATE": "Conv. fake rate",
277 "PH_SCALE_CONVEFFICIENCY": "Conv. efficiency",
278 "EG_SCALE_LARCALIB": r"$\alpha_{1/2}$ $\mu\to e$ extrap.",
279 "EG_SCALE_E4SCINTILLATOR": "Scintillators",
280 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE": r"Temp. 2015 $\to$ 2016",
281 "EG_SCALE_LARCALIB_EXTRA2015PRE": r"$\alpha_{1/2}$ Run 1 $\to$ Run 2",
282 }
283 return d.get(sysname, sysname)
284
285

◆ calibrate_eta_pt()

plot.calibrate_eta_pt ( tool,
etas,
pts,
simulation = True,
particle = "unconverted" )

Definition at line 180 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

180def calibrate_eta_pt(tool, etas, pts, simulation=True, particle="unconverted"):
181 log.debug("creating TEvent and EgammaFactory")
182 event = ROOT.xAOD.TEvent()
183 factory = ROOT.EgammaFactory()
184 result = np.ones((len(pts), len(etas)))
185 ei = factory.create_eventinfo(simulation, 266904)
186 assert ei.eventType(ROOT.xAOD.EventInfo.IS_SIMULATION) == simulation
187 log.debug("looping")
188 for ieta, eta in enumerate(etas):
189 for ipt, pt in enumerate(pts):
190 if particle == "unconverted":
191 p = factory.create_photon(eta, 0.1, pt * np.cosh(eta), 0)
192 elif particle == "converted":
193 p = factory.create_photon(eta, 0.1, pt * np.cosh(eta), 100)
194 elif particle == "electron":
195 p = factory.create_electron(eta, 0.1, pt * np.cosh(eta))
196 else:
197 raise ValueError()
198 result[ipt, ieta] = tool.getEnergy(p, ei)
199 log.debug("deleting event")
200 del event
201 log.debug("returning result %s", result)
202 return result
203
204

◆ check_fast()

plot.check_fast ( basedir,
esmodel )

Definition at line 1369 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1369def check_fast(basedir, esmodel):
1370 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1371 tool.setProperty("ESModel", esmodel)
1372 tool.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1373 tool.setProperty[bool]("doSmearing", 0)
1374 tool.initialize()
1375
1376 tool_fast = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1377 tool_fast.setProperty("ESModel", esmodel)
1378 tool_fast.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1379 tool_fast.setProperty[bool]("doSmearing", 0)
1380 tool_fast.setProperty[bool]("useFastSim", True)
1381 tool_fast.initialize()
1382
1383 for ptype in "electron", "converted", "unconverted":
1384 compare_two_tools_eta(
1385 tool_fast,
1386 tool,
1387 pt=100e3,
1388 simulation=True,
1389 name="fast_%s_%s" % (esmodel, ptype),
1390 basedir=basedir,
1391 particle=ptype,
1392 title="fast correction effect %s %s 100 GeV" % (esmodel, ptype),
1393 )
1394
1395

◆ check_gain()

plot.check_gain ( basedir,
esmodel )

Definition at line 1332 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1332def check_gain(basedir, esmodel):
1333 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1334 tool.setProperty("ESModel", esmodel)
1335 tool.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1336 tool.setProperty[bool]("doSmearing", 0)
1337 tool.initialize()
1338
1339 tool_no_gain = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1340 tool_no_gain.setProperty("ESModel", esmodel)
1341 tool_no_gain.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1342 tool_no_gain.setProperty[bool]("doSmearing", 0)
1343 tool_no_gain.setProperty[bool]("useGainCorrection", 0)
1344 tool_no_gain.initialize()
1345
1346 for ptype in "electron", "unconverted", "converted":
1347 compare_two_tools_eta_pt(
1348 tool_no_gain,
1349 tool,
1350 simulation=False,
1351 name="gain_%s_%s" % (esmodel, ptype),
1352 basedir=basedir,
1353 particle=ptype,
1354 title="gain correction effect - %s - %s" % (esmodel, ptype),
1355 )
1356
1357 compare_two_tools_eta(
1358 tool_no_gain,
1359 tool,
1360 40e3,
1361 simulation=False,
1362 name="gain_%s_%s_40GeV" % (esmodel, "electron"),
1363 basedir=basedir,
1364 title="gain correction effect - %s 40 GeV electron" % esmodel,
1365 particle="electron",
1366 )
1367
1368

◆ check_status_code()

plot.check_status_code ( func)

Definition at line 64 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

64def check_status_code(func):
65 def wrapper(self, *args):
66 status = func(self, *args)
67 if not status.isSuccess():
68 raise ValueError("status is not success")
69 return status
70
71 return wrapper
72
73

◆ check_uniformity()

plot.check_uniformity ( basedir,
esmodel )

Definition at line 1396 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1396def check_uniformity(basedir, esmodel):
1397 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1398 tool.setProperty("ESModel", esmodel)
1399 tool.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1400 tool.setProperty[bool]("doSmearing", 0)
1401 tool.initialize()
1402
1403 tool_no_uniformity = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1404 tool_no_uniformity.setProperty("ESModel", esmodel)
1405 tool_no_uniformity.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1406 tool_no_uniformity.setProperty[bool]("doSmearing", 0)
1407 tool_no_uniformity.setProperty[bool]("usePhiUniformCorrection", 0)
1408 tool_no_uniformity.initialize()
1409
1410 compare_two_tools_eta_phi(
1411 tool_no_uniformity,
1412 tool,
1413 pt=100e3,
1414 simulation=False,
1415 name="uniformity_%s" % esmodel,
1416 basedir=basedir,
1417 particle="unconverted",
1418 title="uniformity correction effect - %s - unconverted 100 GeV" % esmodel,
1419 )
1420
1421

◆ compare_all_syst_fixed_pt()

plot.compare_all_syst_fixed_pt ( basedir,
esmodels,
names = None,
labels = None )

Definition at line 1422 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1422def compare_all_syst_fixed_pt(basedir, esmodels, names=None, labels=None):
1423 names = names or esmodels
1424 labels = labels or names
1425 tools = []
1426 for esmodel in esmodels:
1427 if type(esmodel) is str:
1428 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_%s" % esmodel)
1429 tool.setProperty("ESModel", esmodel)
1430 tool.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1431 tool.setProperty[bool]("doSmearing", 0)
1432 tool.initialize()
1433 tools.append(tool)
1434 else:
1435 tools.append(esmodel)
1436 plot_all_syst_fixed_pt(tools, names=names, labels=labels, basedir=basedir)
1437
1438

◆ compare_sys()

plot.compare_sys ( esmodels = None,
ptypes = None,
decorrelation = "FULL_ETACORRELATED_v1",
eta_edges = None,
pt_edges = None,
basedir = "plots",
smearing = False,
only_up = True,
abs_sys = False,
log_x = False )

Definition at line 839 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

850):
851 esmodels = esmodels or ["es2012c"]
852 ptypes = ptypes or ["electron"]
853 if pt_edges is None:
854 pt_edges = np.linspace(0, 100, 5)
855 if eta_edges is None:
856 eta_edges = np.array([0, 0.6, 1.0, 1.37, 1.55, 1.82, 2.47])
857 pt_edges = np.asarray(pt_edges)
858 eta_edges = np.asarray(eta_edges)
859
860 pt_midpoints = 0.5 * (pt_edges[1:] + pt_edges[:-1])
861
862 log.info(
863 "comparing systematics for esmodels=%s, ptypes=%s, #pt-bins=%d, #eta-bins=%d",
864 (esmodels, ptypes, len(pt_edges) - 1, len(eta_edges) - 1)
865 )
866
867 effects = {}
868 for esmodel in esmodels:
869 log.info("creating tool for %s", esmodel)
870 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
871 tool.setProperty("ESModel", esmodel)
872 tool.setProperty("decorrelationModel", decorrelation)
873 tool.setProperty[int]("randomRunNumber", 297730)
874 if not smearing:
875 tool.setProperty[bool]("doSmearing", 0)
876 tool.initialize()
877
878 log.info("computing systematics for %s", esmodel)
879
880 sys_values = compute_or_read_sys(tool, ptypes, eta_edges, pt_edges)
881 effects[esmodel] = sys_values
882
883 log.debug("delete tool")
884 del tool
885
886 def sorting_function(sys):
887 return max(
888 np.abs(effects[esmodel][ptype].get(sys, np.zeros(1))).max()
889 for esmodel in esmodels
890 for ptype in ptypes
891 )
892
893 all_sys = set()
894 for effects_esmodel in effects.values():
895 for effects_particle in effects_esmodel.values():
896 all_sys |= set(effects_particle.keys())
897
898 if only_up:
899 all_sys = set(s for s in all_sys if "__1up" in s)
900 all_sys = set(s for s in all_sys if "RESOLUTION" not in s)
901 sorted_sys = sorted(all_sys, key=sorting_function, reverse=True)
902
903 log.info("plot")
904 log.info("sorted sys: %s", sorted_sys)
905 colors = sns.color_palette("Set2", len(esmodels))
906 line_styles = "--", ":", "-"
907
908 for ptype, (ieta, (eta1, eta2)) in tqdm.tqdm(
909 product(ptypes, enumerate(pairwise(eta_edges))),
910 total=len(ptypes) * (len(eta_edges) - 1),
911 desc="plotting",
912 leave=False,
913 ):
914 nsub_x, nsub_y = divide_square(len(sorted_sys))
915 fig, axs = plt.subplots(nsub_x, nsub_y, figsize=(14, 8), sharex=True)
916 if hasattr(axs, "flat"):
917 axs = axs.flat
918 else:
919 axs = [axs]
920 for ax, sys in zip(axs, sorted_sys):
921 for iesmodel, esmodel in enumerate(esmodels):
922 if sys in effects[esmodel][ptype]:
923 values = effects[esmodel][ptype][sys][:, ieta]
924 if abs_sys:
925 values = np.abs(values)
926 else:
927 values = np.zeros_like(pt_midpoints)
928 ax.plot(
929 pt_midpoints / 1e3,
930 values * 100,
931 label=esmodel,
932 ls=line_styles[iesmodel],
933 color=colors[iesmodel],
934 )
935
936 ylimits = [0.01, 0.3, 0.7, 2.1, 5] # possible y-axis maxima
937 for ylimit in ylimits:
938 if max(np.abs(values)) * 100 < ylimit:
939 if abs_sys:
940 ax.set_ylim(0, ylimit)
941 else:
942 ax.set_ylim(-ylimit, ylimit)
943 break
944
945 title = sys.replace("EG_SCALE_", "").replace("PH_SCALE_", "").replace("__1up", "")
946 if len(title) > 17:
947 title = title[:17] + "..."
948 ax.set_title(title, fontsize=9)
949 ax.yaxis.set_major_locator(MaxNLocator(6, prune="both"))
950 ax.xaxis.set_major_locator(MaxNLocator(4))
951 ax.tick_params(axis="both", which="major", labelsize=8)
952 ax.tick_params(axis="y", which="minor", left="off", right="off")
953
954 if log_x:
955 ax.set_xscale("log")
956 ax.set_ylabel("")
957
958 for ax in axs:
959 if ax.is_last_row():
960 ax.set_xlabel("$p_{T}$ [GeV]", fontsize=11)
961 if ax.is_first_col():
962 ax.set_ylabel("effect [%]", fontsize=11)
963 fig.subplots_adjust(wspace=0.4, hspace=0.27, bottom=0.15)
964
965 handles = [
966 mlines.Line2D([], [], color=colors[i], ls=line_styles[i]) for i in range(len(esmodels))
967 ]
968 labels = esmodels
969 fig.legend(
970 handles,
971 labels,
972 ncol=len(esmodels),
973 loc="upper center",
974 bbox_to_anchor=(0.1, -0.14, 0.7, 0.2),
975 mode="expand",
976 borderaxespad=0.0,
977 )
978
979 fig.suptitle(r"%s $|\eta|\in [%.2f, %.2f]$" % (ptype, eta1, eta2), fontsize=14)
980
981 figname = "compare_sys_%s_eta_%.2f_%.2f_vs_pT" % (ptype, eta1, eta2)
982 log.info("saving %s", figname)
983 for extension in extensions:
984 fig.savefig(os.path.join(basedir, "%s.%s" % (figname, extension)))
985 plt.close(fig)
986
987
988@timed
#define max(a, b)
Definition cfImp.cxx:41
STL class.
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130

◆ compare_two_tools_eta()

plot.compare_two_tools_eta ( tool1,
tool2,
pt,
simulation,
name,
basedir,
title,
particle = "unconverted" )

Definition at line 1263 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1265):
1266 etas = np.arange(-4.5, 4.5, 0.01)
1267 r1 = calibrate_eta_pt(tool1, etas, [pt], simulation, particle)
1268 r2 = calibrate_eta_pt(tool2, etas, [pt], simulation, particle)
1269 r = r1 / r2 - 1
1270 r = r[0]
1271 print(r)
1272 f, ax = plt.subplots()
1273 r = np.nan_to_num(r)
1274 ax.plot(etas, r * 100)
1275 ax.set_xlabel(r"$\eta$")
1276 ax.set_ylabel("effect [%]")
1277 ax.set_title(title)
1278 ax.axis("tight")
1279 ax.grid()
1280 for extension in extensions:
1281 f.savefig(os.path.join(basedir, name + "." + extension))
1282 plt.close(f)
1283
1284
void print(char *figname, TCanvas *c1)

◆ compare_two_tools_eta_phi()

plot.compare_two_tools_eta_phi ( tool1,
tool2,
pt,
simulation,
name,
basedir,
title,
particle = "unconverted" )

Definition at line 1285 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1287):
1288 etas = np.arange(-4.5, 4.5, 0.1)
1289 phis = np.arange(-np.pi, np.pi, 0.1)
1290 r1 = eval_sys_eta_phi(tool1, etas, phis, pt, simulation, particle)
1291 r2 = eval_sys_eta_phi(tool2, etas, phis, pt, simulation, particle)
1292 r = r1 / r2 - 1
1293 f, ax = plt.subplots()
1294 m = np.max(np.abs(r))
1295 p = ax.pcolormesh(phis, etas, r * 100, vmin=-m * 100, vmax=m * 100)
1296 ax.set_xlabel(r"$\phi$")
1297 ax.set_ylabel(r"$\eta$")
1298 ax.set_title(title)
1299 ax.axis("tight")
1300 cb = f.colorbar(p)
1301 cb.ax.set_ylabel("ratio to nominal [%]")
1302 for extension in extensions:
1303 f.savefig(os.path.join(basedir, name + "." + extension))
1304 plt.close(f)
1305
1306

◆ compare_two_tools_eta_pt()

plot.compare_two_tools_eta_pt ( tool1,
tool2,
simulation,
name,
basedir,
title,
particle = "unconverted" )

Definition at line 1307 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1309):
1310 etas = np.arange(-4.5, 4.5, 0.05)
1311 pts = np.logspace(3.2, 6, 50)
1312 r1 = calibrate_eta_pt(tool1, etas, pts, simulation, particle)
1313 r2 = calibrate_eta_pt(tool2, etas, pts, simulation, particle)
1314 r = r1 / r2 - 1
1315 f, ax = plt.subplots()
1316 r = np.nan_to_num(r)
1317 m = np.max(np.abs(r))
1318 p = ax.pcolormesh(etas, pts / 1e3, r * 100, vmin=-m * 100, vmax=m * 100)
1319 ax.set_yscale("log")
1320 ax.set_ylabel("$p_T$ [GeV]")
1321 ax.set_xlabel(r"$\eta$")
1322 ax.set_title(title)
1323 ax.axis("tight")
1324
1325 cb = f.colorbar(p)
1326 cb.ax.set_ylabel("ratio to nominal [%]")
1327 for extension in extensions:
1328 f.savefig(os.path.join(basedir, name + "." + extension))
1329 plt.close(f)
1330
1331

◆ compute_or_read_sys()

plot.compute_or_read_sys ( tool,
ptypes,
eta_edges,
pt_edges )

Definition at line 794 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

794def compute_or_read_sys(tool, ptypes, eta_edges, pt_edges):
795 empty_set = ROOT.CP.SystematicSet()
796
797 eta_edges = np.asarray(eta_edges)
798 pt_edges = np.asarray(pt_edges)
799
800 # TODO: replace midpoints with supersampling
801 eta_midpoints = 0.5 * (eta_edges[1:] + eta_edges[:-1])
802 pt_midpoints = 0.5 * (pt_edges[1:] + pt_edges[:-1])
803
804 log.debug("getting list of systematics")
805 all_syst = tool.recommendedSystematics()
806 log.debug("%d systematics found", len(all_syst))
807
808 results = {ptype: {} for ptype in ptypes}
809
810 with tqdm.tqdm(total=len(ptypes) * (len(all_syst) + 1), leave=False) as pbar:
811 for iptype, ptype in enumerate(ptypes):
812 log.debug("computing for particle=%s", ptype)
813 tool.applySystematicVariation(empty_set)
814 log.debug(
815 "computing nominal energies for eta=%s, pt=%s, particle=%s",
816 eta_midpoints,
817 pt_midpoints,
818 ptype,
819 )
820
821 values_nominal = calibrate_eta_pt(tool, eta_midpoints, pt_midpoints, particle=ptype)
822 pbar.update(1)
823
824 for isys, sys in enumerate(all_syst):
825 sys_name = sys.name()
826 sys_set = ROOT.CP.SystematicSet()
827 sys_set.insert(sys)
828 tool.applySystematicVariation(sys_set)
829 values_sys = calibrate_eta_pt(tool, eta_midpoints, pt_midpoints, particle=ptype)
830 ratio = values_sys / values_nominal - 1
831
832 results[ptype][sys_name] = ratio
833 pbar.update(1)
834
835 return results
836
837
838@timed

◆ divide_square()

plot.divide_square ( n,
horizontal = True )
divide a figure into a square number of subplots in an optimized way 

Definition at line 115 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

115def divide_square(n, horizontal=True):
116 """ divide a figure into a square number of subplots in an optimized way """
117 if horizontal:
118 x = np.ceil(np.sqrt(n))
119 y = np.floor(np.sqrt(n))
120 if (x * y) < n:
121 x += 1
122 else:
123 x = np.floor(np.sqrt(n))
124 y = np.ceil(np.sqrt(n))
125 if (x * y) < n:
126 y += 1
127 return int(x), int(y)
128
129

◆ eval_eta_slice()

plot.eval_eta_slice ( tool,
etas,
pts,
ptype,
only_material = False,
only_up = True )

Definition at line 225 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

225def eval_eta_slice(tool, etas, pts, ptype, only_material=False, only_up=True):
226 sys_set = ROOT.CP.SystematicSet()
227 tool.applySystematicVariation(sys_set)
228 nominal = calibrate_eta_pt(tool, etas, pts, particle=ptype)
229 all_syst = tool.recommendedSystematics()
230
231 results = {}
232 for sys in all_syst:
233 sys_name = sys.name()
234 if "RESOLUTION" in sys_name:
235 continue
236 if "1down" in sys_name and only_up:
237 continue
238 if only_material:
239 if "MAT" not in sys_name:
240 continue
241 log.info("computing sys %s, %d eta samplings", sys_name, len(etas))
242 sys_set = ROOT.CP.SystematicSet()
243 sys_set.insert(sys)
244 tool.applySystematicVariation(sys_set)
245
246 sys = calibrate_eta_pt(tool, etas, pts, particle=ptype)
247
248 ratio = sys / nominal
249
250 ratio = np.average(ratio - 1, axis=1) # average the supersampling
251 results[sys_name] = ratio
252 return results
253
254

◆ eval_sys_eta_phi()

plot.eval_sys_eta_phi ( tool,
etas,
phis,
pt,
simulation,
particle = "unconverted" )

Definition at line 205 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

205def eval_sys_eta_phi(tool, etas, phis, pt, simulation, particle="unconverted"):
206 event = ROOT.xAOD.TEvent()
207 factory = ROOT.EgammaFactory()
208 result = np.ones((len(etas), len(phis)))
209 ei = factory.create_eventinfo(simulation, 100000)
210 for ieta, eta in enumerate(etas):
211 for iphi, phi in enumerate(phis):
212 if particle == "unconverted":
213 p = factory.create_photon(eta, phi, pt * np.cosh(eta), 0)
214 elif particle == "converted":
215 p = factory.create_photon(eta, phi, pt * np.cosh(eta), 100)
216 elif particle == "electron":
217 p = factory.create_electron(eta, phi, pt * np.cosh(eta))
218 else:
219 raise ValueError()
220 result[ieta, iphi] = tool.getEnergy(p, ei)
221 del event
222 return result
223
224

◆ generator_photon()

plot.generator_photon ( self)

Definition at line 169 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

169def generator_photon(self):
170 store = ROOT.xAOD.TStore()
171
172 factory = ROOT.EgammaFactory(store)
173 for eta in np.arange(-2.5, 2.5, 0.05):
174 for e in np.arange(1e3, 1000e3, 100e3):
175 photon = factory.create_photon(eta, 0.1, e, 0)
176 yield photon
177 store.clear()
178
179

◆ histo2data()

plot.histo2data ( histo)

Definition at line 130 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

130def histo2data(histo):
131 xs = []
132 ys = []
133 exs = []
134 eys = []
135 for ibin in range(1, histo.GetNbinsX() + 1):
136 xs.append(histo.GetBinCenter(ibin))
137 ys.append(histo.GetBinContent(ibin))
138 eys.append(histo.GetBinError(ibin))
139 exs.append(0.5 * histo.GetBinWidth(ibin))
140 return np.array(xs), np.array(exs), np.array(ys), np.array(eys)
141
142

◆ list_systematics()

plot.list_systematics ( esmodels,
decorrelation = "FULL_ETACORRELATED_v1" )

Definition at line 1655 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1655def list_systematics(esmodels, decorrelation="FULL_ETACORRELATED_v1"):
1656 if type(esmodels) is str:
1657 esmodels = [esmodels]
1658 elif esmodels is None:
1659 log.warning("no esmodel specified, using es2012c")
1660 esmodels = ["es2012c"]
1661 syslist_esmodel = {}
1662 for esmodel in esmodels:
1663 log.debug("creating tool for %s", esmodel)
1664 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
1665 tool.setProperty("ESModel", esmodel)
1666 tool.setProperty("decorrelationModel", decorrelation)
1667 tool.initialize()
1668 syslist_esmodel[esmodel] = [s.name() for s in systematics_from_tool(tool, only_scale=False)]
1669
1670 for esmodel, sys_list in syslist_esmodel.items():
1671 print("esmodel: %s %s UP variations" % (esmodel, len(sys_list)))
1672 for sysname in sys_list:
1673 print(" {:10s}".format(sysname))
1674
1675 if len(esmodels) > 1:
1676 log.info("comparing the %s esmodels", len(esmodels))
1677 all_sys = set([item for sublist in syslist_esmodel.values() for item in sublist])
1678 print(" " * 40 + "".join(" [%d] " % i for i in range(len(esmodels))))
1679 for sysname in sorted(all_sys):
1680 cross = "".join(
1681 [
1682 " x " if sysname in syslist_esmodel[esmodel] else " "
1683 for esmodel in esmodels
1684 ]
1685 )
1686 print(("{:40s}".format(sysname) + cross))
1687 for iesmodel, esmodel in enumerate(esmodels):
1688 print("[%d] = %s" % (iesmodel, esmodel))
1689
1690
1691@timed

◆ main()

plot.main ( )

Definition at line 1692 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1692def main():
1693 from argparse import ArgumentParser, RawDescriptionHelpFormatter
1694
1695 parser = ArgumentParser(
1696 formatter_class=RawDescriptionHelpFormatter,
1697 epilog="""
1698to produce paper plots for systematics:
1699 python plot.py sys_eta_slices --beautify-sysnames --sys-order paper_run1 --superimpose-all --skip-null-sys --esmodels es2016PRE --min-sys-value -0.01 --max-sys-value 0.02 --symmetrize-labels --pt-bins-logspace 5E3 1E6 100
1700
1701 # python plot.py sys_eta_slices --beautify-sysnames --sys-order paper_run1 --superimpose-all --skip-null-sys --esmodels es2016data_mc15c_summer_improved --min-sys-value -0.01 --max-sys-value 0.02 --symmetrize-labels --pt-bins-logspace 5E3 1E6 100
1702
1703to produce paper plot for resolution (the name of the esmodels here are the ones used by the internal class)
1704 python plot.py resolution-err --esmodels es2017 --abs-sys --pt-bins-linspace 5E3 200E3 200
1705
1706to compare systematics between tools vs pT:
1707 python plot.py compare_sys --particles electron converted unconverted --esmodels es2016data_mc15c_summer_improved es2016data_mc15c_summer --eta-bins 0 0.6 1.0 1.37 1.55 1.82 2.47 --pt-bins-logspace 5E3 1500E3 50 --abs-sys --log-x
1708
1709to plot all systematics in a 2d plot (eta, pt):
1710 python plot.py all_sys --esmodel es2016data_mc15c_summer es2012c --decorrelation=FULL_ETACORRELATED_v1 --eta-bins-linspace -2.5 2.5 50 --pt-bins-linspace 15E3 100E3 50 --particles converted unconverted --sys-filters *LARCALIB* *LARELECUNCONV*
1711
1712to produce scale factor correction (doScaleCorrection on/off):
1713 python plot.py scale --esmodels es2015PRE es2016data_mc15c_summer
1714
1715to list the systematics:
1716 python plot.py list-systematics --esmodels es2012c es2016data_mc15c_summer es2016data_mc15c_summer_improved es2017_R21_PRE
1717""",
1718 )
1719 parser.add_argument(
1720 "action",
1721 choices=[
1722 "compare_sys",
1723 "compute_sys",
1724 "uA2MeV",
1725 "zee",
1726 "material",
1727 "scale",
1728 "cterm",
1729 "all",
1730 "gain",
1731 "uniformity",
1732 "sys_fixed_pt",
1733 "sys_eta_slices",
1734 "all_sys",
1735 "resolution",
1736 "fast",
1737 "resolution-err",
1738 "list-systematics",
1739 ],
1740 default="all",
1741 help="what to do",
1742 )
1743 parser.add_argument("--esmodels", nargs="*", help="esmodel to consider")
1744 parser.add_argument("--decorrelation", default="FULL_ETACORRELATED_v1")
1745 parser.add_argument(
1746 "--particles",
1747 nargs="*",
1748 help="the particle (electron/converted/unconverted)",
1749 default=["electron"],
1750 )
1751 parser.add_argument("--beautify-sysnames", action="store_true")
1752 parser.add_argument("--eta-bins", nargs="*", type=float, help="edges of the eta-bins")
1753 parser.add_argument(
1754 "--eta-bins-linspace", nargs=3, type=float, help="edge of the eta-bins as min max nbins"
1755 )
1756 parser.add_argument("--pt-bins", nargs="*", type=float, help="edges of the pt-bins")
1757 parser.add_argument(
1758 "--pt-bins-linspace", nargs=3, type=float, help="edge of the eta-bins as min max nbins"
1759 )
1760 parser.add_argument(
1761 "--pt-bins-logspace", nargs=3, type=float, help="edge of the eta-bins as min max nbins"
1762 )
1763 parser.add_argument(
1764 "--super-sampling-eta", type=int, default=5, help="how many point to average inside a bin"
1765 )
1766 parser.add_argument(
1767 "--sys-order",
1768 choices=["paper_run1", "paper_run2"],
1769 help="how to order systematics, options: paper_run1, paper_run2",
1770 )
1771 parser.add_argument("--debug", action="store_true")
1772 parser.add_argument(
1773 "--superimpose-all", action="store_true", help="superimpose sum of systematics"
1774 )
1775 parser.add_argument("--skip-null-sys", action="store_true", help="do not plot null systematics")
1776 parser.add_argument("--yrange", nargs=2, type=float)
1777 parser.add_argument("--add-down", action="store_true", help="plot also the down systematics")
1778 parser.add_argument(
1779 "--legend-outside", action="store_true", help="draw the legend outside the plot"
1780 )
1781 parser.add_argument("--symmetrize-labels", action="store_true")
1782 parser.add_argument(
1783 "--abs-sys", action="store_true", help="consider the abs value of the systeamatics"
1784 )
1785 parser.add_argument("--log-x", action="store_true", help="use log scale")
1786 parser.add_argument("--log-pt", action="store_true", help="use log scale for pT")
1787 parser.add_argument(
1788 "--sys-filters", nargs="*", help="list of wildcard to filter systematic names"
1789 )
1790 parser.add_argument("--min-sys-value", type=float, help="min value for the systematic axis")
1791 parser.add_argument("--max-sys-value", type=float, help="max value for the systematic axis")
1792 parser.add_argument("--grid", action="store_true", help="show grid")
1793 parser.add_argument(
1794 "--plot-qsum",
1795 action="store_true",
1796 help="plot the quadrature sum of the systematics for debug (should be equal to 1NP up)",
1797 )
1798 parser.add_argument(
1799 "--atlas-label", default="Internal", help='Internal, Preliminary, ..., use "" for papers'
1800 )
1801 args = parser.parse_args()
1802
1803 if args.debug:
1804 log.setLevel(logging.DEBUG)
1805 log.debug("DEBUG activated")
1806
1807 if args.eta_bins_linspace:
1808 args.eta_bins = np.linspace(
1809 args.eta_bins_linspace[0], args.eta_bins_linspace[1], int(args.eta_bins_linspace[2] + 1)
1810 )
1811 if args.pt_bins_linspace:
1812 args.pt_bins = np.linspace(
1813 args.pt_bins_linspace[0], args.pt_bins_linspace[1], int(args.pt_bins_linspace[2] + 1)
1814 )
1815 if args.pt_bins_logspace:
1816 args.pt_bins = np.logspace(
1817 np.log10(args.pt_bins_logspace[0]),
1818 np.log10(args.pt_bins_logspace[1]),
1819 int(args.pt_bins_logspace[2] + 1),
1820 )
1821
1822 basedir = "plots"
1823 if not os.path.exists(basedir):
1824 os.makedirs(basedir)
1825
1826 if args.action == "list-systematics":
1827 list_systematics(args.esmodels, args.decorrelation)
1828
1829 if args.action == "compute_sys":
1830 log.info("computing systematics")
1831 for esmodel in args.esmodels or ["es2012c"]:
1832 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
1833 tool.setProperty("ESModel", esmodel)
1834 tool.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1835 tool.setProperty[bool]("doSmearing", 0)
1836 tool.initialize()
1837 result = compute_or_read_sys(tool, ["electron"], args.eta_bins, args.pt_bins)
1838 print(result)
1839
1840 if args.action == "compare_sys":
1841 log.info("comparing systematics")
1842 compare_sys(
1843 args.esmodels,
1844 ptypes=args.particles,
1845 decorrelation=args.decorrelation,
1846 eta_edges=args.eta_bins,
1847 pt_edges=args.pt_bins,
1848 abs_sys=args.abs_sys,
1849 log_x=args.log_x,
1850 )
1851
1852 if args.action == "resolution-err":
1853 log.info("plotting resolution error")
1854 plot_resolution_error(basedir="plots", **vars(args))
1855
1856 if args.action == "zee" or args.action == "all":
1857 log.info("plotting scale systematics")
1858 plot_all_Zee_syst(etas=np.arange(-2.5, 2.5, 0.01), pt=100e3, basedir="plots")
1859
1860 if args.action == "all" or args.action == "uA2MeV":
1861 log.info("plotting uA2MeV")
1862 tool_es2015PRE_nouA2MeV = ROOT.CP.EgammaCalibrationAndSmearingTool(
1863 "tool_es2015PRE_nouA2MeV"
1864 )
1865 tool_es2015PRE_nouA2MeV.setProperty("ESModel", "es2015PRE")
1866 tool_es2015PRE_nouA2MeV.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1867 tool_es2015PRE_nouA2MeV.setProperty[bool]("doSmearing", 0)
1868 tool_es2015PRE_nouA2MeV.setProperty[bool]("use_uA2MeV_2015_first2weeks_correction", 0)
1869 tool_es2015PRE_nouA2MeV.initialize()
1870
1871 tool_es2015PRE = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE")
1872 tool_es2015PRE.setProperty("ESModel", "es2015PRE")
1873 tool_es2015PRE.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1874 tool_es2015PRE.setProperty[bool]("doSmearing", 0)
1875 tool_es2015PRE.initialize()
1876
1877 compare_two_tools_eta(
1878 tool_es2015PRE,
1879 tool_es2015PRE_nouA2MeV,
1880 100e3,
1881 simulation=False,
1882 name="uA2MeV",
1883 basedir=basedir,
1884 title="with uA2MeV correction / without",
1885 particle="electron",
1886 )
1887
1888 del tool_es2015PRE_nouA2MeV
1889 del tool_es2015PRE
1890
1891 if args.action == "all" or args.action == "scale":
1892 log.info("plotting scales")
1893 plot_all_scales(
1894 esmodels=args.esmodels,
1895 labels=args.esmodels,
1896 basedir=basedir,
1897 etas=np.arange(-2.5, 2.5, 0.01),
1898 add_patch=False,
1899 debug=args.debug,
1900 )
1901 if args.action == "all" or args.action == "fast":
1902 log.info("plotting full / fast scale")
1903 check_fast(basedir, "es2015PRE")
1904 plot_all_scales(
1905 esmodels=("es2015PRE", ("es2015PRE", ("useFastSim",), (True,), (bool,))),
1906 labels=("2015PRE", "2015PRE FAST"),
1907 basedir=basedir,
1908 etas=np.arange(-2.5, 2.5, 0.01),
1909 )
1910 if args.action == "all" or args.action == "cterm":
1911 log.info("plotting smearings")
1912 plot_all_cterms(
1913 esmodels=("es2012c", "es2012XX", "es2015PRE"),
1914 labels=("2012", "new", "new + temp"),
1915 basedir=basedir,
1916 etas=np.arange(-2.5, 2.5, 0.01),
1917 )
1918
1919 if args.action == "gain" or args.action == "all":
1920 check_gain(basedir, "es2015PRE")
1921
1922 if args.action == "uniformity" or args.action == "all":
1923 check_uniformity(basedir, "es2012c")
1924 check_uniformity(basedir, "es2015PRE")
1925
1926 if args.action == "sys_fixed_pt" or args.action == "all":
1927 tool_es2015PRE_notemp = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE_notemp")
1928 tool_es2015PRE_notemp.setProperty("ESModel", "es2015PRE")
1929 tool_es2015PRE_notemp.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
1930 tool_es2015PRE_notemp.setProperty[bool]("doSmearing", 0)
1931 tool_es2015PRE_notemp.setProperty[bool]("use_temp_correction201215", 0)
1932 tool_es2015PRE_notemp.initialize()
1933
1934 compare_all_syst_fixed_pt(
1935 basedir,
1936 ("es2012c", tool_es2015PRE_notemp, "es2015PRE"),
1937 names=("es2012c", "es2015_no_temp", "es2015PRE"),
1938 labels=("es2012c", r"$\oplus$ 7/8 diff $\oplus$ 34/68 diff", r"$\oplus$ LAr temperature"),
1939 )
1940
1941 if args.action == "sys_eta_slices" or args.action == "all":
1942 if not args.eta_bins:
1943 eta_bins = ((0.0, 0.6), (0.6, 1.45), (1.52, 1.7), (1.7, 1.9), (1.9, 2.5), (1.4, 1.6))
1944 log.warning("no eta-binning specified using %s", eta_bins)
1945 else:
1946 eta_bins = list(pairwise(args.eta_bins))
1947 log.info("eta-bin: %s", eta_bins)
1948 for ptype in "electron", "unconverted", "converted":
1949 log.debug("plot all sys FULL_ETACORRELATED_v1 eta slice %s", ptype)
1950 plot_all_syst_eta_slice(
1951 eta_bins,
1952 supersampling_eta=args.super_sampling_eta,
1953 esmodel=args.esmodels[0],
1954 decorrelation="FULL_ETACORRELATED_v1",
1955 ptype=ptype,
1956 basedir=basedir,
1957 beautify_sysnames=args.beautify_sysnames,
1958 sys_order=args.sys_order,
1959 superimpose_all=args.superimpose_all,
1960 skip_null_sys=args.skip_null_sys,
1961 max_sys=args.max_sys_value,
1962 min_sys=args.min_sys_value,
1963 debug=args.debug,
1964 only_up=not args.add_down,
1965 symmetrize_labels=args.symmetrize_labels,
1966 legend_outside=args.legend_outside,
1967 pts=args.pt_bins,
1968 log_x=args.log_x,
1969 plot_qsum=args.plot_qsum,
1970 abs_sys=args.abs_sys,
1971 atlas_label=args.atlas_label,
1972 )
1973
1974 if args.action == "material" or args.action == "all":
1975 if not os.path.exists("material"):
1976 os.makedirs("material")
1977 etabins = ((0.0, 0.6), (0.6, 1.45), (1.52, 1.7), (1.7, 1.9), (1.9, 2.5))
1978 for ptype in "electron", "unconverted", "converted":
1979 plot_all_syst_eta_slice(
1980 etabins,
1981 supersampling_eta=args.super_sampling_eta,
1982 esmodel=args.esmodels[0],
1983 decorrelation="FULL_ETACORRELATED_v1",
1984 ptype=ptype,
1985 basedir="material",
1986 only_material=True,
1987 beautify_sysnames=args.beautify_sysnames,
1988 sys_order=args.sys_order,
1989 skip_null_sys=args.skip_null_sys,
1990 max_sys=args.max_sys_value,
1991 min_sys=args.min_sys_value,
1992 debug=args.debug,
1993 only_up=not args.add_down,
1994 legend_outside=args.legend_outside,
1995 symmetrize_labels=args.symmetrize_labels,
1996 log_x=args.log_x,
1997 plot_qsum=args.plot_qsum,
1998 abs_sys=args.abs_sys,
1999 atlas_label=args.atlas_label,
2000 )
2001
2002 if args.action == "all_sys" or args.action == "all":
2003 for esmodel in args.esmodels:
2004 for ptype in args.particles:
2005 log.info("plotting sys for %s %s", ptype, esmodel)
2006 plot_all_syst_eta_pt(
2007 esmodel=esmodel,
2008 decorrelation=args.decorrelation,
2009 ptype=ptype,
2010 basedir=basedir,
2011 eta_range=args.eta_bins,
2012 pt_range=args.pt_bins,
2013 log_pt=args.log_pt,
2014 abs_sys=args.abs_sys,
2015 sys_filters=args.sys_filters,
2016 min_value=args.min_sys_value,
2017 max_value=args.max_sys_value,
2018 )
2019
2020 if args.action == "resolution" or args.action == "all":
2021 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
2022 tool.setProperty("ESModel", "es2015PRE")
2023 tool.initialize()
2024 pts = np.logspace(3.2, 6, 50)
2025 etas = np.linspace(-2.49, 2.49, 100)
2026 plot_resolution_eta_pt(
2027 basedir, tool, pts, etas, "electron", title="resolution electron es2015PRE"
2028 )
2029 plot_resolution_eta_pt(
2030 basedir, tool, pts, etas, "converted", title="resolution converted es2015PRE"
2031 )
2032 plot_resolution_eta_pt(
2033 basedir, tool, pts, etas, "unconverted", title="resolution unconverted es2015PRE"
2034 )
2035
2036
int main()
Definition hello.cxx:18

◆ pairwise()

plot.pairwise ( iterable)

Definition at line 108 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

108def pairwise(iterable):
109 "s -> (s0,s1), (s1,s2), (s2, s3), ..."
110 a, b = tee(iterable)
111 next(b, None)
112 return zip(a, b)
113
114

◆ partition()

plot.partition ( x,
n )

Definition at line 157 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

157def partition(x, n):
158 r = []
159 for xx in x:
160 r.append(xx)
161 if len(r) == n:
162 yield r
163 r = []
164 continue
165 if len(r) > 0:
166 yield r
167
168

◆ plot_all_cterms()

plot.plot_all_cterms ( esmodels,
basedir,
labels = None,
etas = np.arange(-4.5, 4.5, 0.01) )

Definition at line 1202 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1202def plot_all_cterms(esmodels, basedir, labels=None, etas=np.arange(-4.5, 4.5, 0.01)): # noqa: B008 (used as constant)
1203 labels = labels or esmodels
1204 cterms_all_models = {}
1205 for esmodel, label in zip(esmodels, labels):
1206
1207 tool_with = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_with")
1208 tool_with.setProperty("ESModel", esmodel)
1209 tool_with.setProperty[bool]("doSmearing", 1)
1210 tool_with.initialize()
1211
1212 tool_without = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_without")
1213 tool_without.setProperty("ESModel", esmodel)
1214 tool_without.setProperty[bool]("doSmearing", 0)
1215 tool_without.initialize()
1216
1217 event = ROOT.xAOD.TEvent() # noqa: F841
1218 factory = ROOT.EgammaFactory()
1219 ei = factory.create_eventinfo(True, 100000)
1220
1221 cterms = []
1222 for eta in etas:
1223 el = factory.create_electron(eta, 0.1, 40e3)
1224 en_without = tool_without.getEnergy(el, ei)
1225 ratios = np.zeros(1000)
1226 for repetition in range(1000):
1227 en_with = tool_with.getEnergy(el, ei)
1228 ratios[repetition] = en_with / en_without
1229 cterms.append(np.std(ratios))
1230 cterms_all_models[label] = cterms
1231
1232 f, ax = plt.subplots()
1233 for k, v in cterms_all_models.items():
1234 ax.plot(etas, v, label=k)
1235 ax.set_xlabel(r"$\eta$")
1236 ax.set_ylabel("std (energy with additional cterm / energy without)")
1237
1238 ax.add_patch(
1239 patches.Rectangle(
1240 (-2.47, 0.028 - 0.027),
1241 +2.47 - 1.55,
1242 2 * 0.027,
1243 alpha=0.4,
1244 label="13 TeV cterm 3 bins",
1245 color="k",
1246 )
1247 )
1248 ax.add_patch(
1249 patches.Rectangle((-1.37, -0.003 - 0.014), +1.37 * 2, 2 * 0.014, alpha=0.4, color="k")
1250 )
1251 ax.add_patch(
1252 patches.Rectangle((1.55, 0.028 - 0.027), +2.47 - 1.55, 2 * 0.027, alpha=0.4, color="k")
1253 )
1254 ax.set_ylim(-0.03, 0.06)
1255
1256 ax.grid()
1257 ax.legend()
1258 for extension in extensions:
1259 f.savefig(os.path.join(basedir, "cterms.%s" % extension))
1260 plt.close(f)
1261
1262

◆ plot_all_scales()

plot.plot_all_scales ( esmodels,
basedir,
labels = None,
etas = np.arange(-4.5, 4.5, 0.01),
add_patch = False,
debug = False  # noqa: B008 (range used as constant) )

Definition at line 1078 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1080):
1081 log.info("comparing scale factors %s", esmodels)
1082 log.warning("<mu> fixed")
1083 labels = labels or esmodels
1084 scales = {}
1085
1086 for esmodel, label in zip(esmodels, labels):
1087 energy_with = []
1088 energy_without = []
1089
1090 key_properties = []
1091 value_properties = []
1092 type_properties = []
1093
1094 if type(esmodel) is not str:
1095 key_properties = esmodel[1]
1096 value_properties = esmodel[2]
1097 type_properties = esmodel[3]
1098 esmodel = esmodel[0]
1099
1100 tool_with = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_with")
1101 tool_without = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_without")
1102
1103 for tool in tool_with, tool_without:
1104 if debug:
1105 tool.msg().setLevel(0)
1106 tool.setProperty("ESModel", esmodel)
1107 tool.setProperty[bool]("doSmearing", 0)
1108 for k, v, t in zip(key_properties, value_properties, type_properties):
1109 tool.setProperty[t](k, v)
1110
1111 tool_with.setProperty[bool]("doScaleCorrection", 1)
1112 tool_without.setProperty[bool]("doScaleCorrection", 0)
1113
1114 tool_with.initialize()
1115 tool_without.initialize()
1116
1117 event = ROOT.xAOD.TEvent() # noqa: F841
1118 factory = ROOT.EgammaFactory()
1119 log.warning("using eveninfo 266904")
1120 ei = factory.create_eventinfo(False, 266904)
1121
1122 for eta in etas:
1123 el = factory.create_electron(eta, 0.1, 40e3)
1124 en_with = tool_with.getEnergy(el, ei)
1125 en_without = tool_without.getEnergy(el, ei)
1126 energy_with.append(en_with)
1127 energy_without.append(en_without)
1128 scales[label] = np.array(energy_without) / np.array(energy_with) - 1
1129
1130 f, ax = plt.subplots()
1131 for k, v in scales.items():
1132 ax.plot(etas, v * 100, label=k)
1133 ax.set_xlabel(r"$\eta$", fontsize=15, x=1, ha="right")
1134 ax.set_ylabel("energy without scale factors / energy with scale factors - 1 [%]", fontsize=10)
1135 ax.grid()
1136
1137 if add_patch:
1138 ax.add_patch(
1139 patches.Rectangle(
1140 (-2.47, -0.013 * 100 - 0.0168 * 100),
1141 +2.47 - 1.55,
1142 2 * 0.0168 * 100,
1143 alpha=0.4,
1144 label="13 TeV scales 3 bins",
1145 color="k",
1146 )
1147 )
1148 # ax.add_patch(patches.Rectangle((-1.55, 0.00419 * 100 - 0.001 * 100), +1.55 - 1.37, 2 * 0.001 * 100, alpha=0.4, color='k'))
1149 ax.add_patch(
1150 patches.Rectangle(
1151 (-1.37, -0.0121 * 100 - 0.0052 * 100),
1152 2 * +1.37,
1153 2 * 0.0052 * 100,
1154 alpha=0.4,
1155 color="k",
1156 )
1157 )
1158 ax.add_patch(
1159 patches.Rectangle(
1160 (1.55, -0.013 * 100 - 0.0168 * 100),
1161 +2.47 - 1.55,
1162 2 * 0.0168 * 100,
1163 alpha=0.4,
1164 color="k",
1165 )
1166 )
1167
1168 ax.add_patch(
1169 patches.Rectangle(
1170 (-2.47, -0.00649344 * 100 - 0.00465043 * 100),
1171 +2.47 * 2,
1172 2 * 0.00465043 * 100,
1173 alpha=0.5,
1174 label="13 TeV scales 1 bin",
1175 color="orange",
1176 )
1177 )
1178
1179 ax.legend()
1180
1181 for extension in extensions:
1182 f.savefig(os.path.join(basedir, "scales.%s" % extension))
1183 plt.close(f)
1184
1185 # ratio plot
1186 reference = labels[0]
1187 ratio = {label: scales[label] - scales[reference] for label in labels}
1188 f, ax = plt.subplots()
1189 for k, v in ratio.items():
1190 ax.plot(etas, v, label=k)
1191 ax.set_xlabel(r"$\eta$", fontsize=15, x=1, ha="right")
1192 ax.set_ylabel("scales - scales (%s)" % reference, fontsize=10)
1193 ax.grid()
1194 ax.legend()
1195 f.tight_layout()
1196
1197 for extension in extensions:
1198 f.savefig(os.path.join(basedir, "scales_difference_%s.%s" % (reference, extension)))
1199 plt.close(f)
1200
1201

◆ plot_all_syst_eta_pt()

plot.plot_all_syst_eta_pt ( esmodel = "es2012c",
decorrelation = "FULL_v1",
ptype = "unconverted",
basedir = "plots",
eta_range = None,
pt_range = None,
log_pt = False,
abs_sys = False,
only_up = False,
sys_filters = None,
min_value = None,
max_value = None )
Plot a 2D map (eta, pT) of the value of the systematic in %

Definition at line 989 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1002):
1003 """
1004 Plot a 2D map (eta, pT) of the value of the systematic in %
1005 """
1006 log.debug("creating tool")
1007 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
1008 tool.setProperty("ESModel", esmodel)
1009 tool.setProperty("decorrelationModel", decorrelation)
1010 tool.setProperty[int]("doSmearing", 0)
1011 log.warning("setting randomRunNumber to 297730")
1012 tool.setProperty[int]("randomRunNumber", 297730)
1013 tool.initialize()
1014
1015 etas = eta_range if eta_range is not None else np.arange(-3, 3, 0.1)
1016 pts = pt_range if pt_range is not None else np.logspace(4, 7, 100)
1017
1018 nominal = calibrate_eta_pt(tool, etas, pts, particle=ptype)
1019
1020 all_syst = tool.recommendedSystematics()
1021
1022 nplotted = 0
1023
1024 for sys in tqdm.tqdm(all_syst):
1025 sys_name = sys.name()
1026 if "RESOLUTION" in sys_name:
1027 log.debug("skipping %s", sys_name)
1028 continue
1029 if only_up and "1up" not in sys_name:
1030 log.debug("skipping %s", sys_name)
1031 continue
1032 if sys_filters is not None:
1033 if not any(fnmatch(sys_name, sys_filter) for sys_filter in sys_filters):
1034 log.debug("skipping %s", sys_name)
1035 continue
1036 nplotted += 1
1037 log.info("computing sys %s", sys_name)
1038
1039 sys_set = ROOT.CP.SystematicSet()
1040 sys_set.insert(sys)
1041 tool.applySystematicVariation(sys_set)
1042
1043 sys = calibrate_eta_pt(tool, etas, pts, particle=ptype)
1044
1045 ratio = sys / nominal
1046 ratio[nominal == 0] = 1
1047 # TODO: check why nan
1048 ratio[np.isnan(ratio)] = 1
1049 ratio = ratio - 1
1050 vmax = max_value or np.percentile(np.abs(ratio), 95)
1051 if abs_sys:
1052 ratio = np.abs(ratio)
1053
1054 f, ax = plt.subplots()
1055 p = ax.pcolormesh(etas, pts / 1e3, ratio * 100.0, vmin=-vmax * 100, vmax=vmax * 100)
1056 ax.set_title("%s\n%s\n%s" % (ptype, esmodel, sys_name), loc="left")
1057 ax.set_xlabel(r"$\eta$", x=1.0, ha="right")
1058 ax.set_ylabel(r"$p_T$ [GeV]", y=1.0, ha="right")
1059 if log_pt:
1060 ax.set_yscale("log")
1061 cb = f.colorbar(p)
1062 cb.ax.set_ylabel("systematic effect [%]")
1063 for extension in extensions:
1064 f.savefig(
1065 os.path.join(
1066 basedir, "%s_%s_%s_%s.%s" % (ptype, esmodel, decorrelation, sys_name, extension)
1067 )
1068 )
1069 plt.close(f)
1070
1071 if nplotted == 0:
1072 log.warning("no systematic plotted")
1073 else:
1074 log.info("%d systematic plotted", nplotted)
1075
1076
1077@timed

◆ plot_all_syst_eta_slice()

plot.plot_all_syst_eta_slice ( etabins,
supersampling_eta = 3,
esmodel = "es2012c",
decorrelation = "FULL_v1",
ptype = "unconverted",
pts = np.logspace(np.log10(5e3), 6, 100),
basedir = "plot",
only_material = False,
beautify_sysnames = False,
sys_order = None,
superimpose_all = False,
skip_null_sys = False,
min_sys = -0.02,
max_sys = 0.02,
only_up = True,
debug = False,
legend_outside = False,
symmetrize_labels = False,
log_x = False,
plot_qsum = False,
abs_sys = False,
atlas_label = "Internal" )

Definition at line 295 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

318):
319 tool = ROOT.CP.EgammaCalibrationAndSmearingTool("tool")
320 tool.setProperty("ESModel", esmodel)
321 tool.setProperty("decorrelationModel", decorrelation)
322 tool.setProperty[bool]("doSmearing", 0)
323 log.warning("setting randomRunNumber to 297730")
324 tool.setProperty[int]("randomRunNumber", 297730)
325 if debug:
326 tool.msg().setLevel(0)
327
328 tool.initialize()
329
330 if superimpose_all:
331 tool_all = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_all")
332 tool_all.setProperty("ESModel", esmodel)
333 tool_all.setProperty("decorrelationModel", "1NP_v1")
334 tool_all.setProperty[bool]("doSmearing", 0)
335 log.warning("setting randomRunNumber to 297730")
336 tool_all.setProperty[int]("randomRunNumber", 297730)
337 tool_all.initialize()
338
339 # compute the eta-inclusive one, just to sort
340 log.info("compute sys inclusively, just to sort sys by importance")
341 results = eval_eta_slice(
342 tool,
343 np.linspace(-2.5, 2.5, 20),
344 np.linspace(10e3, 200e3, 10), # use this range to mimic the range in the paper
345 ptype,
346 only_material,
347 )
348 sorted_sys_name = sorted(list(results), key=lambda k: -np.max(np.abs(results[k])))
349 if skip_null_sys:
350 sorted_sys_name = [
351 sys_name for sys_name in sorted_sys_name if np.sum(results[sys_name]) != 0
352 ]
353 if sys_order is not None:
354 if sys_order == "paper_run1":
355 partitions = [
356 [
357 "EG_SCALE_PS__1up",
358 "EG_SCALE_S12__1up",
359 "EG_SCALE_LARCALIB__1up",
360 "EG_SCALE_L2GAIN__1up",
361 ],
362 [
363 "EG_SCALE_MATID__1up",
364 "EG_SCALE_MATCRYO__1up",
365 "EG_SCALE_MATCALO__1up",
366 "EG_SCALE_ZEESYST__1up",
367 ],
368 ]
369 if esmodel == "es2016PRE":
370 partitions += [
371 [
372 "EG_SCALE_PEDESTAL__1up",
373 "EG_SCALE_LARCALIB_EXTRA2015PRE__1up",
374 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__1up",
375 "EG_SCALE_E4SCINTILLATOR__1up",
376 ]
377 ]
378 elif sys_order == "paper_run2":
379 partitions = [
380 [
381 "EG_SCALE_PS__1up",
382 "EG_SCALE_S12__1up",
383 "EG_SCALE_LARCALIB__1up",
384 "EG_SCALE_LARCALIB_EXTRA2015PRE__1up",
385 "EG_SCALE_S12EXTRALASTETABINRUN2",
386 ],
387 [
388 "EG_SCALE_MATID__1up",
389 "EG_SCALE_MATCRYO__1up",
390 "EG_SCALE_MATCALO__1up",
391 "EG_SCALE_MATPP0__1up",
392 "EG_SCALE_ZEESYST__1up",
393 ],
394 [
395 "EG_SCALE_L2GAIN__1up",
396 "EG_SCALE_WTOTS1__1up",
397 "EG_SCALE_PEDESTAL__1up",
398 "EG_SCALE_E4SCINTILLATOR__1up",
399 ],
400 [
401 "PH_SCALE_CONVEFFICIENCY__1up",
402 "PH_SCALE_CONVFAKERATE__1up",
403 "PH_SCALE_CONVRADIUS__1up",
404 "PH_SCALE_LEAKAGECONV__1up",
405 "PH_SCALE_LEAKAGEUNCONV__1up",
406 ],
407 ]
408 else:
409 raise ValueError("cannot understand sys_order = %s" % sys_order)
410 flat_list = [item for sublist in partitions for item in sublist]
411 remainers = [item for item in sorted_sys_name if item not in flat_list]
412 partitions = chain(partitions, partition(remainers, 4))
413 else:
414 partitions = partition(sorted_sys_name, 4)
415 partitions = list(partitions)
416
417 for etamin, etamax in tqdm.tqdm(etabins):
418 log.info("plotting eta range %.2f %.2f", etamin, etamax)
419 etas = np.linspace(etamin, etamax, supersampling_eta + 2)[1:-1]
420 results = eval_eta_slice(tool, etas, pts, ptype, only_material, only_up=only_up)
421 result_values = np.array(list(results.values()))
422 qsum = np.sqrt((result_values ** 2).sum(axis=0))
423
424 if superimpose_all:
425 results_all = eval_eta_slice(tool_all, etas, pts, ptype, only_up=False)
426
427 for ip, p in enumerate(partitions):
428 log.info("plotting %d/%d", ip + 1, len(partitions))
429
430 f, ax = plt.subplots()
431 if superimpose_all:
432 # max_up_down = np.max(np.abs([results_all["EG_SCALE_ALL__1down"],
433 # results_all["EG_SCALE_ALL__1up"]]), axis=0)
434 # ax.fill_between(pts / 1E3, -max_up_down * 100., max_up_down * 100,
435 # color='0.8', label='total')
436 # ax.plot(pts/1E3, np.sqrt(np.sum([r ** 2 for r in results.values()], axis=0)) * 100., 'r:')
437 if only_up:
438 if abs_sys:
439 ax.fill_between(
440 pts / 1e3,
441 0,
442 results_all["EG_SCALE_ALL__1up"] * 100,
443 color="0.8",
444 label="Total",
445 )
446 else:
447 ax.fill_between(
448 pts / 1e3,
449 -results_all["EG_SCALE_ALL__1up"] * 100.0,
450 results_all["EG_SCALE_ALL__1up"] * 100,
451 color="0.8",
452 label="Total",
453 )
454 else:
455 ax.fill_between(
456 pts / 1e3,
457 results_all["EG_SCALE_ALL__1down"] * 100.0,
458 results_all["EG_SCALE_ALL__1up"] * 100,
459 color="0.8",
460 label="Total",
461 )
462 for isys, sys_name in enumerate(p):
463 color = "C%d" % isys # TODO: fix, use cycle
464 if sys_name not in results:
465 continue # TODO: FIXME
466 r = results[sys_name]
467 r[np.isnan(r)] = 0
468 sys_label = (
469 beautify_sysname(sys_name.replace("__1up", ""))
470 if beautify_sysnames
471 else sys_name
472 )
473 if not only_up:
474 sys_label += " UP"
475 if abs_sys:
476 mask_positive = r >= 0
477 r = np.abs(r)
478 ax.plot(
479 pts[mask_positive] / 1e3,
480 r[mask_positive] * 100.0,
481 label=sys_label,
482 color=color,
483 )
484 ax.plot(pts[~mask_positive] / 1e3, r[~mask_positive] * 100.0, "--", color=color)
485 else:
486 ax.plot(pts / 1e3, r * 100.0, label=sys_label, color=color)
487
488 if not only_up:
489 ax.set_prop_cycle(None)
490 for sys_name in p:
491 sys_name = sys_name.replace("up", "down")
492 if sys_name not in results:
493 continue # TODO: FIXME
494 r = results[sys_name]
495 r[np.isnan(r)] = 0
496 sys_label = (
497 beautify_sysname(sys_name.replace("__1down", ""))
498 if beautify_sysnames
499 else sys_name
500 )
501 sys_label += " DOWN"
502 ax.plot(pts / 1e3, r * 100.0, label=sys_label, linestyle="--")
503
504 if plot_qsum:
505 ax.plot(pts / 1e3, qsum * 100, label="quadrature sum", linestyle=":")
506
507 ax.set_xlabel("$E_T$ [GeV]", ha="right", x=1.0, fontsize=19)
508 if abs_sys:
509 ax.set_ylabel("Uncertainty [%]", ha="right", y=1.0, fontsize=19)
510 else:
511 ax.set_ylabel("Signed uncertainty [%]", ha="right", y=1.0, fontsize=19)
512
513 ax.tick_params(axis="both", which="major", labelsize=17)
514
515 ax.axis("tight")
516
517 if max_sys is None and min_sys is None:
518 max_sys = max(2, np.max(np.abs(ax.get_ylim())))
519 min_sys = -max_sys
520
521 ax.set_ylim(min_sys * 100, max_sys * 100)
522
523 if legend_outside:
524 ax.legend(
525 bbox_to_anchor=(0.0, 1.0, 1, 0.2),
526 mode="expand",
527 borderaxespad=0.0,
528 loc=3,
529 frameon=True,
530 fontsize=17 if only_up else 14,
531 borderpad=1,
532 ncol=1 if only_up else 2,
533 )
534 f.subplots_adjust(top=0.65)
535 plot_ATLAS(f, 0.2, 0.58, label=atlas_label)
536 f.text(0.2, 0.2, beautify_particle(ptype), transform=ax.transAxes, fontsize=16)
537 f.text(
538 0.2,
539 0.25,
540 r"$%.2f < \eta < %.2f$" % (etamin, etamax),
541 transform=ax.transAxes,
542 fontsize=16,
543 )
544 else:
545 ax.legend(
546 loc=1,
547 frameon=False,
548 fontsize=13 if only_up else 9,
549 borderpad=1,
550 ncol=1 if only_up else 2,
551 )
552
553 plot_ATLAS(f, 0.16, 0.80, label=atlas_label, fontsize=19)
554 f.text(0.16, 0.74, beautify_particle(ptype), transform=ax.transAxes, fontsize=16)
555 f.text(
556 0.16,
557 0.68,
558 r"$%.2f < \eta < %.2f$" % (etamin, etamax),
559 transform=ax.transAxes,
560 fontsize=16,
561 )
562
563 if log_x:
564 ax.set_xscale("log")
565
566 for extension in extensions:
567 f.savefig(
568 os.path.join(
569 basedir,
570 "%s_%s_%s_%.2f_%.2f_%d.%s"
571 % (ptype, esmodel, decorrelation, etamin, etamax, ip, extension),
572 ),
573 bbox_inches="tight",
574 )
575 plt.close(f)
576
577

◆ plot_all_syst_fixed_pt()

plot.plot_all_syst_fixed_pt ( tools,
names,
labels,
pt = 100e3,
ptype = "unconverted",
basedir = "plots" )

Definition at line 758 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

758def plot_all_syst_fixed_pt(tools, names, labels, pt=100e3, ptype="unconverted", basedir="plots"):
759 for tool in tools:
760 empty_set = ROOT.CP.SystematicSet()
761 tool.applySystematicVariation(empty_set)
762 etas_histo = np.linspace(-5, 5, 101, True)
763 etas = 0.5 * (etas_histo[1:] + etas_histo[:-1])
764 nominals = [calibrate_eta_pt(tool, etas, [pt], particle=ptype)[0] for tool in tools]
765 all_syst = tools[0].recommendedSystematics()
766 for sys in all_syst:
767 sys_name = sys.name()
768 sys_set = ROOT.CP.SystematicSet()
769 sys_set.insert(sys)
770 log.info("plotting sys %s %s", sys_name, ptype)
771
772 f, ax = plt.subplots()
773
774 for tool, nominal, name, label in zip(tools, nominals, names, labels):
775 tool.applySystematicVariation(sys_set)
776 sys = calibrate_eta_pt(tool, etas, [pt], particle=ptype)[0]
777 ratio = sys / nominal - 1
778 ax.plot(etas, ratio * 100, label=label)
779 histo = values2histo(name + "_" + sys_name, label, etas_histo, ratio * 100)
780 fout.WriteTObject(histo)
781
782 ax.grid()
783 ax.legend()
784 ax.set_ylabel("effect [%]")
785 ax.set_title(ptype + " " + sys_name + " at $p_{T}$ = %.2f GeV" % (pt / 1e3))
786 ax.set_xlabel(r"$\eta$")
787 for extension in extensions:
788 f.savefig(
789 os.path.join(basedir, "%s_%s_pt_%.2f.%s" % (ptype, sys_name, pt / 1e3, extension))
790 )
791 plt.close(f)
792
793

◆ plot_all_Zee_syst()

plot.plot_all_Zee_syst ( etas,
pt = 100e3,
basedir = "plots" )

Definition at line 588 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

588def plot_all_Zee_syst(etas, pt=100e3, basedir="plots"):
589
590 tool_es2012c = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2012c")
591 tool_es2012c.setProperty("ESModel", "es2012c")
592 tool_es2012c.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
593 tool_es2012c.setProperty[int]("doSmearing", 0)
594 tool_es2012c.initialize()
595
596 tool_es2015PRE = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE")
597 tool_es2015PRE.setProperty("ESModel", "es2015PRE")
598 tool_es2015PRE.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
599 tool_es2015PRE.setProperty[bool]("doSmearing", 0)
600 tool_es2015PRE.initialize()
601
602 tool_es2015PRE_notemp = ROOT.CP.EgammaCalibrationAndSmearingTool("tool_es2015PRE_notemp")
603 tool_es2015PRE_notemp.setProperty("ESModel", "es2015PRE")
604 tool_es2015PRE_notemp.setProperty("decorrelationModel", "FULL_ETACORRELATED_v1")
605 tool_es2015PRE_notemp.setProperty[bool]("doSmearing", 0)
606 tool_es2015PRE_notemp.setProperty[int]("use_temp_correction201215", 0)
607 tool_es2015PRE_notemp.initialize()
608
609 tools = [tool_es2012c, tool_es2015PRE_notemp, tool_es2015PRE]
610
611 nominal_es2012c = calibrate_eta_pt(tool_es2012c, etas, [pt], particle="electron")[0]
612 nominal_es2015PRE = calibrate_eta_pt(tool_es2015PRE, etas, [pt], particle="electron")[0]
613 nominal_es2015PRE_notemp = calibrate_eta_pt(
614 tool_es2015PRE_notemp, etas, [pt], particle="electron"
615 )[0]
616
617 # up variations
618 sys = ROOT.CP.SystematicVariation("EG_SCALE_ZEESYST", 1)
619 sys_set = ROOT.CP.SystematicSet()
620 sys_set.insert(sys)
621
622 for tool in tools:
623 tool.applySystematicVariation(sys_set)
624
625 sys_up_es2012c = calibrate_eta_pt(tool_es2012c, etas, [pt], particle="electron")[0]
626 sys_up_es2015PRE = calibrate_eta_pt(tool_es2015PRE, etas, [pt], particle="electron")[0]
627 sys_up_es2015PRE_notemp = calibrate_eta_pt(
628 tool_es2015PRE_notemp, etas, [pt], particle="electron"
629 )[0]
630
631 ratio_sys_up_es2012c = sys_up_es2012c / nominal_es2012c - 1
632 ratio_sys_up_es2015PRE = sys_up_es2015PRE / nominal_es2015PRE - 1
633 ratio_sys_up_es2015PRE_notemp = sys_up_es2015PRE_notemp / nominal_es2015PRE_notemp - 1
634
635 # down variations
636 sys = ROOT.CP.SystematicVariation("EG_SCALE_ZEESYST", -1)
637 sys_set = ROOT.CP.SystematicSet()
638 sys_set.insert(sys)
639
640 for tool in tools:
641 tool.applySystematicVariation(sys_set)
642
643 sys_down_es2012c = calibrate_eta_pt(tool_es2012c, etas, [pt], particle="electron")[0]
644 sys_down_es2015PRE = calibrate_eta_pt(tool_es2015PRE, etas, [pt], particle="electron")[0]
645 sys_down_es2015PRE_notemp = calibrate_eta_pt(
646 tool_es2015PRE_notemp, etas, [pt], particle="electron"
647 )[0]
648
649 ratio_sys_down_es2012c = sys_down_es2012c / nominal_es2012c - 1
650 ratio_sys_down_es2015PRE = sys_down_es2015PRE / nominal_es2015PRE - 1
651 ratio_sys_down_es2015PRE_notemp = sys_down_es2015PRE_notemp / nominal_es2015PRE_notemp - 1
652
653 # up stat
654 sys = ROOT.CP.SystematicVariation("EG_SCALE_ZEESTAT", 1)
655 sys_set = ROOT.CP.SystematicSet()
656 sys_set.insert(sys)
657 tool_es2015PRE.applySystematicVariation(sys_set)
658 stat_up_es2015PRE = calibrate_eta_pt(tool_es2015PRE, etas, [pt], particle="electron")[0]
659 ratio_stat_up = stat_up_es2015PRE / nominal_es2015PRE - 1
660
661 # down stat
662 sys = ROOT.CP.SystematicVariation("EG_SCALE_ZEESTAT", -1)
663 sys_set = ROOT.CP.SystematicSet()
664 sys_set.insert(sys)
665 tool_es2015PRE.applySystematicVariation(sys_set)
666 stat_down_es2015PRE = calibrate_eta_pt(tool_es2015PRE, etas, [pt], particle="electron")[0]
667 ratio_stat_down = stat_down_es2015PRE / nominal_es2015PRE - 1
668
669 ratio_full_down = -np.sqrt(ratio_stat_down ** 2 + ratio_sys_down_es2015PRE ** 2)
670 ratio_full_up = np.sqrt(ratio_stat_up ** 2 + ratio_sys_up_es2015PRE ** 2)
671
672 fig, ax = plt.subplots()
673
674 ax.fill_between(
675 etas,
676 ratio_full_down,
677 ratio_full_up,
678 color="#d69e8f",
679 interpolate=False,
680 label=r"$\cdots\oplus$ stat = 2015PRE (stat $\oplus$ sys)",
681 alpha=0.6,
682 )
683 ax.fill_between(
684 etas,
685 ratio_sys_down_es2015PRE,
686 ratio_sys_up_es2015PRE,
687 color="#d7d790",
688 interpolate=False,
689 label=r"$\cdots\oplus$ temp = 2015PRE sys",
690 alpha=0.6,
691 )
692 ax.fill_between(
693 etas,
694 ratio_sys_down_es2015PRE_notemp,
695 ratio_sys_up_es2015PRE_notemp,
696 color="#91da95",
697 label=r"$\cdots\oplus$ 7/8 TeV diff $\oplus$ 34/68 bins diff",
698 alpha=0.6,
699 )
700 ax.fill_between(
701 etas,
702 ratio_sys_down_es2012c,
703 ratio_sys_up_es2012c,
704 color="#93dcd1",
705 interpolate=False,
706 label="2012c",
707 alpha=0.6,
708 )
709
710 p1 = patches.Rectangle((0, 0), 1, 1, color="#d69e8f")
711 p2 = patches.Rectangle((0, 0), 1, 1, color="#d7d790")
712 p3 = patches.Rectangle((0, 0), 1, 1, color="#91da95")
713 p4 = patches.Rectangle((0, 0), 1, 1, color="#93dcd1")
714
715 legend1 = ax.legend(
716 [p4, p3, p2, p1],
717 [
718 "2012c",
719 r"$\cdots\oplus$ 7/8 TeV diff $\oplus$ 34/68 bins diff",
720 r"$\cdots\oplus$ temp = 2015PRE sys",
721 r"$\cdots\oplus$ stat = 2015PRE (stat $\oplus$ sys)",
722 ],
723 loc="upper right",
724 numpoints=1,
725 title="errors",
726 )
727
728 f = ROOT.TFile("~/Data6_scaledData.root")
729 histo_scale = f.Get("alpha")
730 x, ex, y, ey = histo2data(histo_scale)
731
732 h1 = ax.errorbar(x, y, yerr=ey, xerr=ex, fmt="o", zorder=11)
733
734 f2 = ROOT.TFile("~/uA2MeV.root")
735 histo_uA2MeV = f2.Get("histo_uA2MeV_week12")
736 x, ex, y, ey = histo2data(histo_uA2MeV)
737 (line_uA2MeV,) = ax.plot(x, y - 1, "k-", zorder=10, label="expected deviation")
738 ax.plot(-x, y - 1, "k-", zorder=10)
739
740 ax.set_xlabel(r"$\eta$")
741 ax.set_ylim(-0.08, 0.08)
742
743 ax.legend(
744 [h1, line_uA2MeV],
745 ["scales 13 TeV|es2015 PRE", "expected deviation"],
746 loc="lower right",
747 numpoints=1,
748 )
749 ax.add_artist(legend1)
750
751 ax.grid()
752
753 fig.savefig("Zee_sys.png")
754 fig.savefig("Zee_sys.svg")
755 fig.savefig("Zee_sys.pdf")
756
757

◆ plot_ATLAS()

plot.plot_ATLAS ( fig,
x,
y,
label = "Internal",
fontsize = 20 )

Definition at line 92 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

92def plot_ATLAS(fig, x, y, label="Internal", fontsize=20):
93 label = fig.text(x, y, "ATLAS", fontsize=fontsize, fontstyle="italic", fontweight="bold")
94
95 def on_draw(event):
96 x_right = label.get_window_extent().transformed(fig.transFigure.inverted()).max[0]
97 fig.text(x_right, y, label, fontsize=fontsize)
98 fig.canvas.mpl_disconnect(cid)
99 return False
100
101 cid = fig.canvas.mpl_connect("draw_event", on_draw)
102 fig.canvas.draw()
103
104

◆ plot_resolution_error()

plot.plot_resolution_error ( basedir,
** kwargs )

Definition at line 1476 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1476def plot_resolution_error(basedir, **kwargs):
1477 esmodels = kwargs["esmodels"] or (
1478 "es2012c",
1479 "es2015PRE",
1480 "es2015PRE_res_improved",
1481 "es2016PRE",
1482 "es2017",
1483 )
1484 if kwargs["eta_bins"] is not None:
1485 eta_bins = pairwise(kwargs["eta_bins"])
1486 else:
1487 eta_bins = (0, 0.4), (0.4, 0.6), (0.6, 1.37), (1.52, 1.8), (1.8, 2.37)
1488 for esmodel in esmodels:
1489 log.debug("plotting resolution error for %s", esmodel)
1490 tool = ROOT.AtlasRoot.egammaEnergyCorrectionTool()
1491 if kwargs["debug"]:
1492 tool.msg().setLevel(0)
1493 tool.setESModel(getattr(ROOT.egEnergyCorr, esmodel))
1494 tool.initialize()
1495 for particle in ("electron", "converted", "unconverted"):
1496 log.info("plotting resolution %s", particle)
1497 for eta_min, eta_max in tqdm.tqdm(eta_bins):
1498 plot_resolution_error_bin(
1499 eta_min, eta_max, particle, esmodel, basedir, tool=tool, **kwargs
1500 )
1501
1502

◆ plot_resolution_error_bin()

plot.plot_resolution_error_bin ( eta_min,
eta_max,
particle,
esmodel,
basedir,
tool = None,
** kwargs )

Definition at line 1503 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1503def plot_resolution_error_bin(eta_min, eta_max, particle, esmodel, basedir, tool=None, **kwargs):
1504 if tool is None:
1505 tool = ROOT.AtlasRoot.egammaEnergyCorrectionTool()
1506 tool.setESModel(getattr(ROOT.egEnergyCorr, esmodel))
1507 tool.initialize()
1508
1509 ptype = {
1510 "electron": ROOT.PATCore.ParticleType.Electron,
1511 "unconverted": ROOT.PATCore.ParticleType.UnconvertedPhoton,
1512 "converted": ROOT.PATCore.ParticleType.ConvertedPhoton,
1513 }[particle]
1514
1515 variations_name_up = {
1516 "Zsmearing up": ROOT.egEnergyCorr.Resolution.ZSmearingUp,
1517 "sampling up": ROOT.egEnergyCorr.Resolution.SamplingTermUp,
1518 "material ID up": ROOT.egEnergyCorr.Resolution.MaterialIDUp,
1519 "material calo up": ROOT.egEnergyCorr.Resolution.MaterialCaloUp,
1520 "material gap up": ROOT.egEnergyCorr.Resolution.MaterialGapUp,
1521 "material cryo up": ROOT.egEnergyCorr.Resolution.MaterialCryoUp,
1522 "pileup up": ROOT.egEnergyCorr.Resolution.PileUpUp,
1523 "material ibl up": ROOT.egEnergyCorr.Resolution.MaterialIBLUp,
1524 "material pp0 up": ROOT.egEnergyCorr.Resolution.MaterialPP0Up,
1525 "all up": ROOT.egEnergyCorr.Resolution.AllUp,
1526 }
1527 variations_name_down = {
1528 "Zsmearing down": ROOT.egEnergyCorr.Resolution.ZSmearingDown,
1529 "sampling down": ROOT.egEnergyCorr.Resolution.SamplingTermDown,
1530 "material ID down": ROOT.egEnergyCorr.Resolution.MaterialIDDown,
1531 "material calo down": ROOT.egEnergyCorr.Resolution.MaterialCaloDown,
1532 "material gap down": ROOT.egEnergyCorr.Resolution.MaterialGapDown,
1533 "material cryo down": ROOT.egEnergyCorr.Resolution.MaterialCryoDown,
1534 "pileup down": ROOT.egEnergyCorr.Resolution.PileUpDown,
1535 "material ibl down": ROOT.egEnergyCorr.Resolution.MaterialIBLDown,
1536 "material pp0 down": ROOT.egEnergyCorr.Resolution.MaterialPP0Down,
1537 "all down": ROOT.egEnergyCorr.Resolution.AllDown,
1538 }
1539 # ^ ^
1540 all_errors = [{}, {}] # up and down
1541 # ,--,
1542
1543 pt_range = kwargs.get("pt_bins")
1544 if pt_range is None:
1545 pt_range = np.linspace(10e3, 2000e3, 100)
1546
1547 nsamples_eta = kwargs["super_sampling_eta"] or 5
1548 eta_range = np.linspace(eta_min, eta_max, nsamples_eta + 2)[1:-1]
1549
1550 only_up = True
1551
1552 for side, errors, variations_name in zip(
1553 ("up", "down"), all_errors, (variations_name_up, variations_name_down)
1554 ):
1555 if only_up and side == "down":
1556 continue
1557
1558 for variation_name, variation_id in variations_name.items():
1559 errors_var_pt_eta = np.zeros((len(pt_range), len(eta_range)))
1560 for ipt, pt in enumerate(pt_range):
1561 for ieta, eta in enumerate(eta_range):
1562 energy = pt * np.cosh(eta)
1563 log.debug(
1564 "evaluating systematics %s in eta=%.2f pt=%.2f on resolution",
1565 (variation_name, eta, pt)
1566 )
1567 errors_var_pt_eta[ipt, ieta] = tool.getResolutionError(
1568 ROOT.PATCore.ParticleDataType.Full, energy, eta, eta, ptype, variation_id
1569 )
1570 errors[variation_name] = errors_var_pt_eta.mean(
1571 axis=1
1572 ) # average over different eta points inside the eta-bin
1573 if kwargs["abs_sys"]:
1574 errors[variation_name] = np.abs(errors[variation_name])
1575
1576# sorted_keys_up = sorted(
1577# variations_name_up.keys(), key=lambda x: np.abs(all_errors[0][x].mean())
1578# )
1579 totals = [
1580 np.sqrt(np.sum([e ** 2 for k, e in errors.items() if "all " not in k]))
1581 for errors in all_errors
1582 ]
1583
1584 fig, ax = plt.subplots()
1585 if only_up:
1586 ax.fill_between(pt_range / 1e3, 0, all_errors[0]["all up"], color="0.8")
1587 else:
1588 ax.fill_between(
1589 pt_range / 1e3, all_errors[0]["all up"], all_errors[1]["all down"], color="0.8"
1590 )
1591 # ax.fill_between(pt_range / 1E3, totals[0], -totals[-1], color='0.8')
1592 # totals[1] *= -1
1593
1594 colors = ["b", "g", "r", "c", "m", "y", "violet", "pink", "orange"]
1595 props = mpl.rcParams["axes.prop_cycle"] # noqa: F841
1596
1597 for side, errors, total in zip(("up", "down"), all_errors, totals):
1598 if only_up and side == "down":
1599 continue
1600 # ax.plot(pt_range / 1E3, total, label='sum %s' % side, color='k')
1601 ax.plot(pt_range / 1e3, errors["all %s" % side], "k", label="all %s" % side)
1602 colors_iter = cycle(colors)
1603 for k in sorted(errors.keys()):
1604 if "all" in k:
1605 continue
1606 v = errors[k]
1607 linestyle = "-"
1608 if "down" in k:
1609 linestyle = "--"
1610 if "all" in k:
1611 linestyle = ":"
1612 ax.plot(pt_range / 1e3, v, linestyle, label=k, color=next(colors_iter))
1613
1614 fig.text(0.16, 0.73, beautify_particle(particle), transform=ax.transAxes, fontsize=15)
1615 fig.text(
1616 0.16,
1617 0.67,
1618 r"$%.2f < \eta < %.2f$" % (eta_min, eta_max),
1619 transform=ax.transAxes,
1620 fontsize=15,
1621 )
1622
1623 ax.set_title("%s" % esmodel)
1624 ax.set_ylabel("relative resolution error [%]", ha="right", y=1.0, fontsize=19)
1625 ax.set_xlabel("$E_T$ [GeV]", ha="right", x=1.0, fontsize=19)
1626 if kwargs["abs_sys"]:
1627 ax.set_ylim(0, 0.6)
1628 else:
1629 ax.set_ylim(-1.7, 1.7)
1630 ax.set_xlim(np.min(pt_range) / 1e3, np.max(pt_range) / 1e3)
1631
1632 fig.subplots_adjust(bottom=0.35)
1633
1634 ax.legend(
1635 loc=3,
1636 bbox_to_anchor=(0.0, -0.5, 1, 0.2),
1637 mode="expand",
1638 ncol=4,
1639 borderaxespad=0.0,
1640 fontsize=10,
1641 )
1642
1643 plot_ATLAS(fig, 0.16, 0.8, "Internal", fontsize=19)
1644
1645 if kwargs["grid"]:
1646 ax.grid()
1647 filename = os.path.join(
1648 basedir, "error_relresolution_%s_%s_eta%.2f-%.2f" % (esmodel, particle, eta_min, eta_max)
1649 )
1650 for ext in "png", "pdf":
1651 fig.savefig(filename + "." + ext, bbox_inches="tight")
1652 plt.close(fig)
1653
1654
double cycle(double a, double b)

◆ plot_resolution_eta_pt()

plot.plot_resolution_eta_pt ( basedir,
tool,
pts,
etas,
ptype,
title )

Definition at line 1439 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

1439def plot_resolution_eta_pt(basedir, tool, pts, etas, ptype, title):
1440 event = ROOT.xAOD.TEvent() # noqa: F841
1441 factory = ROOT.EgammaFactory()
1442 result = np.ones((len(pts), len(etas)))
1443 eta_centers = 0.5 * (etas[1:] + etas[:-1])
1444 pt_centers = 0.5 * (pts[1:] + pts[:-1])
1445
1446 result = np.zeros((len(eta_centers), len(pt_centers)))
1447
1448 for ieta, eta in enumerate(eta_centers):
1449 for ipt, pt in enumerate(pt_centers):
1450 e = pt * np.cosh(eta)
1451 if ptype == "electron":
1452 p = factory.create_electron(eta, 0.1, e)
1453 elif ptype == "converted":
1454 p = factory.create_converted_photon(eta, 0.1, e)
1455 elif ptype == "unconverted":
1456 p = factory.create_unconverted_photon(eta, 0.1, e)
1457 else:
1458 raise ValueError()
1459 res = tool.getResolution(p)
1460 result[ieta, ipt] = res
1461
1462 fig, ax = plt.subplots()
1463 vmin, vmax = np.percentile(result, (2, 98))
1464 p = ax.pcolormesh(pts / 1e3, etas, result, vmin=vmin, vmax=vmax)
1465 ax.set_title(title)
1466 ax.axis("tight")
1467 ax.set_xlabel(r"$p_T$ [GeV]")
1468 ax.set_ylabel(r"$\eta$")
1469 ax.set_xscale("log")
1470 cb = fig.colorbar(p)
1471 cb.ax.set_ylabel("resolution")
1472 for extension in extensions:
1473 fig.savefig(os.path.join(basedir, "resolution_%s.%s" % (ptype, extension)))
1474
1475

◆ systematics_from_tool()

plot.systematics_from_tool ( tool,
only_scale = True,
only_resolution = False,
only_up = True )
return name of the systematics 

Definition at line 143 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

143def systematics_from_tool(tool, only_scale=True, only_resolution=False, only_up=True):
144 """ return name of the systematics """
145 _ = tool.recommendedSystematics()
146 for sys in _:
147 sys_name = sys.name()
148 if only_scale and "RESOLUTION" in sys_name:
149 continue
150 if only_resolution and "SCALE" in sys_name:
151 continue
152 if only_up and "1down" in sys_name:
153 continue
154 yield sys
155
156

◆ timed()

plot.timed ( method)

Definition at line 79 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

79def timed(method):
80 @wraps(method)
81 def timed(*args, **kw):
82 ts = time.time()
83 result = method(*args, **kw)
84 te = time.time()
85
86 log.info("function %s run in %d second", method.__name__, te - ts)
87 return result
88
89 return timed
90
91

◆ values2histo()

plot.values2histo ( name,
title,
x,
y )

Definition at line 578 of file PhysicsAnalysis/ElectronPhotonID/ElectronPhotonFourMomentumCorrection/python/plot.py.

578def values2histo(name, title, x, y):
579 histo = ROOT.TH1F(name, title, len(x) - 1, x)
580 for (
581 ibin,
582 yy,
583 ) in enumerate(y, 1):
584 histo.SetBinContent(ibin, yy)
585 return histo
586
587

Variable Documentation

◆ extensions

str plot.extensions = "pdf", "png"

◆ fout

plot.fout = ROOT.TFile("output_plot.root", "recreate")

◆ handler

◆ IgnoreCommandLineOptions

plot.IgnoreCommandLineOptions

◆ initialize

◆ log

◆ plotter