import basf2
import modularAnalysis as ma
import variables.collections as vc
import variables.utils as vu
from variables import variables as vm
from vibe.core.utils.misc import fancy_validation_mode_header
from vibe.core.validation_mode import ValidationModeBaseClass
__all__ = [
"eetomumugamma",
]
[docs]
@fancy_validation_mode_header
class eetomumugamma(ValidationModeBaseClass):
name = "eetomumugamma"
latex_str = r"$e^+ e^- \rightarrow \mu^+ \mu^- \gamma$"
[docs]
def create_basf2_path(self):
my_path = basf2.Path()
# M_2tracks_limit = 10.56
# isr_theta = np.radians([17, 150]) # degree
# isr_cut = f"[{isr_theta[0]} < clusterTheta < {isr_theta[1]}] and[useCMSFrame(E) > 0.5]"
track_cut = "[dr < 2.0] and [abs(dz) < 5.0] and [p > 1.0]"
isr_cut = "[useCMSFrame(E) > 0.5]"
# ntracks_cut = f"nCleanedTracks({track_cut}) == 2"
# nISR_cut = f"nCleanedECLClusters({isr_cut}) > 0"
# ma.applyEventCuts(f"[{ntracks_cut}] and [{nISR_cut}]", path=my_path)
ma.fillParticleList("mu+:good", track_cut, path=my_path)
ma.fillParticleList("gamma:isr", isr_cut, path=my_path)
ma.rankByHighest("gamma:isr", "useCMSFrame(E)", outputVariable="highestE_rank", numBest=1, path=my_path)
ma.reconstructDecay(
"Z0:2mu -> mu+:good mu-:good",
cut="",
path=my_path,
)
ma.matchMCTruth("Z0:2mu", path=my_path)
ma.reconstructDecay("Z0:g_mumu -> gamma:isr Z0:2mu", cut="", path=my_path)
ma.matchMCTruth("Z0:g_mumu", path=my_path)
vm.addAlias("invM_mumu", "formula(daughter(1,daughterInvM(0,1)))")
vm.addAlias("nISR", "nParticlesInList(gamma:isr)")
vm.addAlias("n_mu", "nParticlesInList(mu+:good)")
vm.addAlias("ntracks_cut", f"nCleanedTracks({track_cut})")
vm.addAlias("nISR_cut", f"nCleanedECLClusters({isr_cut})")
vm.addAlias("DelPhi_mumu", "formula(daughter(1, daughterDiffOfPhi(1,0)))")
vm.addAlias("mcDelPhi_mumu", "formula(daughter(1, mcDaughterDiffOfPhi(1,0)))")
vm.addAlias("DelPhi_mumu_cms", "formula(daughter(1, daughterDiffOfPhiCMS(1,0)))")
vm.addAlias("mcDelPhi_mumu_cms", "formula(daughter(1, daughterDiffOfPhiCMS(1,0)))")
vm.addAlias("Deltheta_mumu", "formula(daughter(1, useRestFrame(daughterDiffOf(0, 1, theta))))")
vm.addAlias("mcDeltheta_mumu", "formula(daughter(1, useRestFrame(daughterDiffOf(0, 1, mcTheta))))")
del_theta = [
"Deltheta_mumu",
"mcDeltheta_mumu",
]
cms_del_theta = vu.create_aliases(del_theta, "useCMSFrame({variable})", "CMS")
Inv_M = (
[
"invM_mumu",
"nISR",
"n_mu",
"ntracks_cut",
"nISR_cut",
"DelPhi_mumu",
"mcDelPhi_mumu",
"DelPhi_mumu_cms",
"mcDelPhi_mumu_cms",
]
+ del_theta
+ cms_del_theta
)
# Inv_M = []
kinematics = vc.kinematics + ["cosTheta", "theta", "phi"]
cms_kinematics = vu.create_aliases(kinematics, "useCMSFrame({variable})", "CMS")
vars = list(vc.mc_kinematics + vc.mc_truth) + kinematics + cms_kinematics
vars += [
"charge",
"mcInitial",
"mcMother(PDG)",
"isSignal",
"particleSource",
]
energy = "E"
Dz = "dz"
vm.addAlias("CMS_E", f"useCMSFrame({energy})")
vm.addAlias("abs_dz", f"abs({Dz})")
isr_cut_variable = ["clusterTheta", "clusterThetaID", "CMS_E", "mcISR", "clusterE1E9", "clusterErrorTiming"]
track_cut_variable = ["dr", "abs_dz", "theta", "clusterThetaID"] + vc.track + vc.track_hits
basic_vars = []
basic_vars += vu.create_aliases_for_selected(
list_of_variables=vars,
decay_string="^vpho -> ^gamma [^Z0 -> ^mu+ ^mu-]",
prefix=["vpho", "isr", "Z0", "mup", "mum"],
)
basic_vars += vu.create_aliases_for_selected(
list_of_variables=isr_cut_variable, decay_string="vpho -> ^gamma [Z0 -> mu+ mu-]", prefix=["Isr"]
)
basic_vars += vu.create_aliases_for_selected(
list_of_variables=track_cut_variable, decay_string="vpho -> gamma [Z0 -> ^mu+ ^mu-]", prefix=["Mup", "Mum"]
)
basic_vars += Inv_M + vc.mc_truth
basic_vars += [
"isSignal",
"nECLOutOfTimeCrystals",
"nECLOutOfTimeCrystalsBWDEndcap",
"nECLOutOfTimeCrystalsBarrel",
]
# basic_vars += [ f"nCleanedTracks({track_cut})", f"nCleanedECLClusters({isr_cut})"]
trigger_variables = []
for trigger_line in self.output_trigger_lines:
trigger_variables.append(f"L1FTDL({trigger_line})")
trigger_variables.append(f"L1PSNM({trigger_line})")
for trigger_line in self.input_trigger_lines:
trigger_variables.append(f"L1Input({trigger_line})")
trigger_variables.append("L1Trigger")
trigger_variables.append("HighLevelTrigger")
self.variables_to_validation_ntuple(
decay_str="Z0:g_mumu",
variables=basic_vars + trigger_variables,
path=my_path,
)
return my_path
@property
def output_trigger_lines(self):
return [
"mu_b2b",
"mu_eb2b",
"eklm2",
"beklm",
"cdcklm1",
"cdcklm2",
"seklm1",
"seklm2",
"ecleklm1",
"stt",
"syo",
"syb",
"yioiecl1",
"fy30",
"lml1",
"lml2",
"lml6",
"lml7",
"lml8",
"lml9",
"lml10",
"lml12",
"lml16",
"eclmumu",
"lml0",
"ffy",
"fyo",
"fyb",
"lume",
"ffo",
"hie",
"c4",
"hie3",
"sttecl",
"ggsel",
"bhapur",
"lml3",
"lml4",
"lml5",
"bha3d",
"bhabha",
"ssb",
"eed",
"fed",
"yp",
"bfyo",
"bhie",
"lml1",
"hiev",
"fffv",
"bg",
"poissonv",
"random",
]
@property
def input_trigger_lines(self):
return [
"klmb2b",
"eklmb2b",
"ecleklm",
"bha_veto",
"ecl_mumu",
"revo",
]