from typing import List
import basf2 as b2
import modularAnalysis as ma
import variables.collections as vc
import variables.utils as vu
import numpy as np
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, Histogram2D, HistComponent
[docs]
@fancy_validation_mode_header
class MuonIDValidationMode(ValidationModeBaseClass):
name = "MuonIDValidationMode"
@property
def plotting_strategies(self):
return [
"per_dataset",
"overlay_datasets",
"overlay_datasets_per_component",
"chunked_per_dataset_component",
"data_mc_comparison",
"normalised_data_mc_comparison",
"data_mc_ratio_2d",
]
[docs]
def create_basf2_path(self):
main = b2.Path()
ma.fillParticleList(
"mu+:reco",
cut="[muonID > 0.5] and [abs(dz) < 2.0] and [dr < 0.5] and [thetaInKLMAcceptance]",
path=main,
)
ma.reconstructDecay(
decayString="Upsilon(4S):reco -> mu+:reco mu-:reco",
cut="10.0 < M < 11.0",
path=main,
)
variables = vu.create_aliases_for_selected(
list(
vc.kinematics + vc.track + vc.pid + vc.vertex + vc.mc_truth + ["thetaInKLMAcceptance", "cosTheta", "phi"]
),
"Upsilon(4S):reco -> ^mu+:reco ^mu-:reco",
["mup", "mum"],
)
self.variables_to_validation_ntuple(
decay_str="Upsilon(4S):reco",
variables=variables,
path=main,
)
return main
@property
def analysis_validation_histograms(self) -> List[Histogram]:
# Define histogram specifications as tuples:
# (name, title, df_label, hist_label, component_label, unit, bins, scope, additional_cut_str)
specs = [
("phi_mup", r"$\mu\mu$", "mup_phi", r"$\phi$", r"$\mu^+$", "rad", 200, (-np.pi, np.pi), None),
("phi_mum", r"$\mu\mu$", "mum_phi", r"$\phi$", r"$\mu^-$", "rad", 200, (-np.pi, np.pi), None),
(
"phi_mup_forwardKLM",
r"Forward KLM Endcap",
"mup_phi",
r"$\phi$",
r"$\mu^+$",
"rad",
200,
(-np.pi, np.pi),
"mup_thetaInKLMAcceptance == 1",
),
(
"phi_mum_forwardKLM",
r"Forward KLM Endcap",
"mum_phi",
r"$\phi$",
r"$\mu^-$",
"rad",
200,
(-np.pi, np.pi),
"mum_thetaInKLMAcceptance == 1",
),
(
"phi_mup_forwardKLMoverlap",
r"Forward KLM Overlap",
"mup_phi",
r"$\phi$",
r"$\mu^+$",
"rad",
200,
(-np.pi, np.pi),
"mup_thetaInKLMAcceptance == 2",
),
(
"phi_mum_forwardKLMoverlap",
r"Forward KLM Overlap",
"mum_phi",
r"$\phi$",
r"$\mu^-$",
"rad",
200,
(-np.pi, np.pi),
"mum_thetaInKLMAcceptance == 2",
),
(
"phi_mup_barrelKLM",
r"Barrel KLM",
"mup_phi",
r"$\phi$",
r"$\mu^+$",
"rad",
200,
(-np.pi, np.pi),
"mup_thetaInKLMAcceptance == 3",
),
(
"phi_mum_barrelKLM",
r"Barrel KLM",
"mum_phi",
r"$\phi$",
r"$\mu^-$",
"rad",
200,
(-np.pi, np.pi),
"mum_thetaInKLMAcceptance == 3",
),
(
"phi_mup_backwardKLMoverlap",
r"Backward KLM Overlap",
"mup_phi",
r"$\phi$",
r"$\mu^+$",
"rad",
200,
(-np.pi, np.pi),
"mup_thetaInKLMAcceptance == 4",
),
(
"phi_mum_backwardKLMoverlap",
r"Backward KLM Overlap",
"mum_phi",
r"$\phi$",
r"$\mu^-$",
"rad",
200,
(-np.pi, np.pi),
"mum_thetaInKLMAcceptance == 4",
),
(
"phi_mup_backwardKLM",
r"Backward KLM Endcap",
"mup_phi",
r"$\phi$",
r"$\mu^+$",
"rad",
200,
(-np.pi, np.pi),
"mup_thetaInKLMAcceptance == 5",
),
(
"phi_mum_backwardKLM",
r"Backward KLM Endcap",
"mum_phi",
r"$\phi$",
r"$\mu^-$",
"rad",
200,
(-np.pi, np.pi),
"mum_thetaInKLMAcceptance == 5",
),
]
# Build Histogram objects from specs
return [
Histogram(
name=name,
title=title,
hist_variable=HistVariable(
df_label=df_label,
label=hist_label,
unit=unit,
bins=bins,
scope=scope,
),
hist_components=[
HistComponent(
label=component_label,
additional_cut_str=additional_cut_str,
)
],
)
for (
name,
title,
df_label,
hist_label,
component_label,
unit,
bins,
scope,
additional_cut_str,
) in specs
]
@property
def analysis_validation_histograms_2d(self) -> List[Histogram2D]:
return [
Histogram2D(
name="phi_vs_cosTheta_mup",
title=r"$\mu^+$: $\phi$ vs $cos\theta$",
x_variable=HistVariable(
df_label="mup_phi",
label=r"$\phi$",
unit="rad",
bins=200,
scope=(-np.pi, np.pi),
),
y_variable=HistVariable(
df_label="mup_cosTheta",
label=r"$cos\theta$",
bins=100,
scope=(-1, 1),
),
hist_components=[
HistComponent(
label=r"$\mu^+$",
)
],
)
]