from typing import List
from copy import deepcopy
import basf2
import modularAnalysis as ma # type: ignore
from variables import variables as vm # type: ignore
import variables.collections as vc # type: ignore
import variables.utils as vu # type: ignore
import pandas as pd # type: ignore
from vibe.core.utils.misc import fancy_validation_mode_header
from vibe.core.validation_mode import ValidationModeBaseClass
from vibe.core.helper.histogram_tools import HistVariable, Histogram, HistComponent
from vibe.core.helper.root_helper import makeROOTCompatible
__all__ = [
"photonReconstruction",
]
[docs]
@fancy_validation_mode_header
class photonReconstruction(ValidationModeBaseClass):
name = "photonReconstruction"
latex_str = r"$e^+ e^- \rightarrow \mu^+ \mu^- \gamma$"
plotting_strategies = ["multi_comparison_binned"]
[docs]
def create_basf2_path(self, **kwargs):
"""
Reconstruction script for photons.
"""
main = basf2.create_path()
ma.fillParticleList("gamma:selection", "", path=main)
ma.applyCuts(
"gamma:selection",
"inECLAcceptance",
path=main,
)
ma.getFakePhotonProbability("gamma:selection", weight="MC16rd", path=main)
ma.getBeamBackgroundProbability("gamma:selection", weight="MC16rd", path=main)
vm.addAlias("beamBackgroundSuppressionScore", "extraInfo(beamBackgroundSuppression)")
vm.addAlias("fakePhotonSuppressionScore", "extraInfo(fakePhotonSuppression)")
self.variables_to_validation_ntuple(
decay_str="gamma:selection",
variables=vu.create_aliases_for_selected(
self.base_particle_vars
+ self.cluster_vars
+ vc.mc_truth
+ vc.mc_kinematics
+ vc.mc_variables
+ [
"mcTheta",
"clusterMCMatchWeight",
"clusterTotalMCMatchWeight",
"clusterBestMCMatchWeight",
"mcSecPhysProc",
"fakePhotonSuppressionScore",
"beamBackgroundSuppressionScore",
],
"^gamma:selection",
["gamma"],
),
path=main,
)
return main
@property
def base_particle_vars(self):
return vc.kinematics + vc.inv_mass + vc.momentum_uncertainty + vc.pid
@property
def cluster_vars(self):
return vc.cluster + [
"clusterE",
"clusterUncorrE",
"clusterThetaID",
"clusterMdstIndex",
"clusterCellID",
"clusterSecondMoment",
"clusterTrackMatch",
"maxWeightedDistanceFromAverageECLTime",
]
[docs]
def generate_variables_for_list(
self,
particle_list: str,
names: List[str],
add_mc_matching: bool,
variables: List[str],
):
variables_to_store = deepcopy(variables)
if add_mc_matching:
variables_to_store += vc.mc_truth + vc.mc_kinematics + vc.mc_variables
return vu.create_aliases_for_selected(variables_to_store, particle_list, names)
@property
def analysis_validation_histograms(self) -> List[Histogram]:
return [
Histogram(
name="Theta",
title="Theta of Photon",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterTheta"),
label="clusterTheta",
unit="rad",
bins=50,
scope=(0.0, 3.1416),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterPhi",
title="ClusterPhi",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterPhi"),
label="clusterPhi",
unit="rad",
bins=50,
scope=(-3.14159, 3.14159),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterTiming",
title="ClusterTiming",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterTiming"),
label="clusterTiming",
unit="ns",
bins=50,
scope=(-100, 100),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="MinC2TDist",
title="Minimum C2T Distance",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_minC2TDist"),
label="minC2TDist",
unit="cm",
bins=50,
scope=(0, 250),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterE1E9",
title="Cluster E1/E9",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterE1E9"),
label="clusterE1E9",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="Cluster9E21",
title="Cluster E9/E21",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterE9E21"),
label="cluster9E21",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterPSDMVA",
title="Cluster PSD MVA",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterPulseShapeDiscriminationMVA"),
label="clusterPulseShapeDiscriminationMVA",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterLAT",
title="Cluster LAT",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterLAT"),
label="clusterLAT",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterE",
title="Cluster Energy",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterE"),
label="clusterE",
unit="GeV",
bins=50,
scope=(0, 2),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterNHits",
title="Cluster Number of Hits",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterNHits"),
label="clusterNHits",
unit="",
bins=30,
scope=(0, 30),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterReg",
title="Cluster Region",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterReg"),
label="clusterReg",
unit="",
bins=13,
scope=(0, 13),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterSecondMoment",
title="Cluster Second Moment",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterSecondMoment"),
label="clusterSecondMoment",
unit="",
bins=50,
scope=(0, 40),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterTrackMatch",
title="Cluster Track Match",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterTrackMatch"),
label="clusterTrackMatch",
unit="",
bins=2,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterZernikeMVA",
title="Cluster Zernike MVA",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterZernikeMVA"),
label="clusterZernikeMVA",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterAbsZernikeMoment40",
title="Cluster Abs Zernike Moment 4 0",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterAbsZernikeMoment40"),
label="clusterAbsZernikeMoment40",
unit="",
bins=50,
scope=(0, 1.7),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterAbsZernikeMoment51",
title="Cluster Abs Zernike Moment 5 1",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterAbsZernikeMoment51"),
label="clusterAbsZernikeMoment51",
unit="",
bins=50,
scope=(0, 1.2),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterEoP",
title="Cluster E over P",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterEoP"),
label="clusterEoP",
unit="",
bins=50,
scope=(0, 2),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterHasFailedTiming",
title="Cluster Has Failed Timing",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterHasFailedTiming"),
label="clusterHasFailedTiming",
unit="",
bins=2,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterHasFailedErrorTiming",
title="Cluster Has Failed Error Timing",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterHasFailedErrorTiming"),
label="clusterHasFailedErrorTiming",
unit="",
bins=2,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterHasNPhotons",
title="Cluster Has N Photons",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterHasNPhotons"),
label="clusterHasNPhotons",
unit="",
bins=2,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterHasNeutralHadron",
title="Cluster Has Neutral Hadron",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterHasNeutralHadron"),
label="clusterHasNeutralHadron",
unit="",
bins=2,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="ClusterHasPulseShapeDiscrimination",
title="Cluster Has Pulse Shape Discrimination",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_clusterHasPulseShapeDiscrimination"),
label="clusterHasPulseShapeDiscrimination",
unit="",
bins=2,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="MaxWeightedDistanceFromAverageECLTime",
title="Max Weighted Distance From Average ECL Time",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_maxWeightedDistanceFromAverageECLTime"),
label="maxWeightedDistanceFromAverageECLTime",
unit="ns",
bins=50,
scope=(0, 5000),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="NECLClusterTrackMatches",
title="Number of ECL Cluster Track Matches",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_nECLClusterTrackMatches"),
label="nECLClusterTrackMatches",
unit="",
bins=10,
scope=(0, 10),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="beamBackgroundSuppressionScore",
title="Beam Background Suppression Score",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_beamBackgroundSuppressionScore"),
label="beamBackgroundSuppressionScore",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
Histogram(
name="fakePhotonSuppressionScore",
title="Fake Photon Suppression Score",
particle_list="gamma:selection",
hist_variable=HistVariable(
df_label=makeROOTCompatible(variable="gamma_fakePhotonSuppressionScore"),
label="fakePhotonSuppressionScore",
unit="",
bins=50,
scope=(0, 1),
),
hist_components=[
HistComponent(
label="Signal",
additional_cut_str="",
),
],
),
]
[docs]
def get_number_of_signal_for_efficiency(self, df: pd.DataFrame, particle_list: str = "gamma:selection") -> float:
return df["gamma_isSignal"].sum()