import Functors as F import FunTuple.functorcollections as FC from DaVinci import Options, make_config from DaVinci.algorithms import create_lines_filter from FunTuple import FunctorCollection from FunTuple import FunTuple_Particles as Funtuple from PyConf.reading import get_particles, get_pvs from RecoConf.event_filters import require_pvs #new imports from PyConf.reading import get_rec_summary, get_odin from Hlt2Conf.flavourTagging import run2_all_taggers import Functors.math as fmath from DaVinciMCTools import MCTruthAndBkgCat from DecayTreeFitter import DecayTreeFitter from GaudiKernel.SystemOfUnits import GeV def main(options: Options): line = "Hlt2RD_XiMinusToLambdaMuNu" data = get_particles(f"/Event/Turbo/{line}/Particles") line_prefilter = create_lines_filter(name=f"PreFilter_{line}", lines=[line]) pvs = get_pvs() Hlt1_decisions = [ "Hlt1TrackMVADecision", "Hlt1TwoTrackMVADecision", ] Hlt2_decisions = ['Hlt2RD_XiMinusToLambdaMuNuDecision', 'Hlt2Topo2BodyDecision', 'Hlt2Topo3BodyDecision', ] fields = { "Xi": "[Xi- -> (Lambda0 -> p+ pi-) mu- ]CC", "Lambda0": "[Xi- -> ^(Lambda0 -> p+ pi-) mu- ]CC", "P_lam": "[Xi- -> (Lambda0 -> ^p+ pi-) mu- ]CC", "Pi_lam": "[Xi- -> (Lambda0 -> p+ ^pi-) mu- ]CC", "Mu": "[Xi- -> (Lambda0 -> p+ pi-) ^mu- ]CC" } DTF_MassFitConsLambda = DecayTreeFitter(name="DTF_MassFitConsLambda", input_particles=data, mass_constraints=["Lambda0"]) DTF_LifetimeFit = DecayTreeFitter(name="DTF_LifetimeFit", input_particles=data, input_pvs=pvs) all_tagging = run2_all_taggers(data) # define helper functors get_lambda = F.CHILD(1, F.FORWARDARG0) get_mu = F.CHILD(2, F.FORWARDARG0) get_SV = F.ENDVERTEX @ F.FORWARDARG0 get_SV_pos = F.TOLINALG @ F.POSITION @ get_SV get_lambda_endvtx_pos = F.ENDVERTEX_POS @ get_lambda get_fdvec_lambda = get_lambda_endvtx_pos - get_SV_pos IP_wrt_SV_Mu = F.IP.bind(get_SV_pos , get_mu) IPCHI2_wrt_SV_Mu = F.IPCHI2.bind(get_SV , get_mu) # define observables IP_wrt_SV = F.IP.bind(get_SV_pos , get_lambda) IPCHI2_wrt_SV = F.IPCHI2.bind(get_SV , get_lambda) FD_wrt_SV = F.MAGNITUDE @ get_fdvec_lambda FDCHI2_wrt_SV = F.VTX_FDCHI2.bind(get_SV, get_lambda) #all_vars = FunctorCollection({ # "M": F.MASS, # "P": F.P, # "PX": F.PX, # "PY": F.PY, # "PZ": F.PZ, # "PT": F.PT, # "ETA": F.ETA, # "PHI": F.PHI, # "CHI2DOF": F.CHI2DOF #}) #variables = {"ALL": all_vars} Xi_variables = FunctorCollection( { #Kinematics "ID": F.PARTICLE_ID, "PT": F.PT, "ETA": F.ETA, "P": F.P, "SUMPT": F.SUM(F.PT), "MASS": F.MASS, #PV related "BPVDIRA": F.BPVDIRA(pvs), "BPVIPCHI2": F.BPVIPCHI2(pvs), "BPVIP": F.BPVIP(pvs), "BPVFDCHI2": F.BPVFDCHI2(pvs), "BPVLTIME": F.BPVLTIME(pvs), "BPVCHI2DOF": F.CHI2DOF @ F.BPV(pvs), "BPVFD": F.BPVFD(pvs), "BPVX": F.BPVX(pvs), "BPVY": F.BPVY(pvs), "BPVZ": F.BPVZ(pvs), #SV related "CHI2DOF": F.CHI2DOF, "END_VX": F.END_VX, "END_VY": F.END_VY, "END_VZ": F.END_VZ, "END_VCHI2DOF": F.CHI2DOF @ F.ENDVERTEX, #Lambda related "LAMBDA_IPwrtSV": IP_wrt_SV, "LAMBDA_IPCHI2wrtSV": IPCHI2_wrt_SV, "LAMBDA_FDwrtSV": FD_wrt_SV, "LAMBDA_FDCHI2wrtSV": FDCHI2_wrt_SV, #Mu related #"Mu_IPwrtSV": IP_wrt_SV_2, #"Mu_IPCHI2wrtSV": IPCHI2_wrt_SV_2, #DTF "DTF_MassFitConsLambda_MASS": DTF_MassFitConsLambda(F.MASS), "DTF_MassFitConsLambda_CHI2DOF": DTF_MassFitConsLambda(F.CHI2DOF), # track or vertex chi2/ndf "DTF_MassFitConsLambda_P": DTF_MassFitConsLambda(F.P), "DTF_LifetimeFit_MASS": DTF_LifetimeFit(F.MASS), "DTF_LifetimeFit_CHI2DOF": DTF_LifetimeFit(F.CHI2DOF), # track or vertex chi2/ndf "DTF_LifetimeFit_CTAU": DTF_LifetimeFit.CTAU, "DTF_LifetimeFit_CTAUERR": DTF_LifetimeFit.CTAUERR, "PX": F.PX, "PY": F.PY, "PZ": F.PZ, # B2OC generic B hadron NN Hlt2 algorithm, # not planning to use it directly for B2OC EM #"MVA": F.MVA( # MVAType="SigmaNet", # Config={ # "File": # "paramfile://data/Hlt2B2OC_B_SigmaNet_Run3-v2.json", # "Name": # "B2OC_SigmaNet_Generic", # "Lambda": # "2.0", # "NLayers": # "3", # "InputSize": # "6", # "Monotone_Constraints": # "[1,-1,-1,-1,-1,-1]", # "Variables": # "log_B_PT,B_ETA,log_B_DIRA,log_B_ENDVERTEX_CHI2,log_B_IPCHI2_OWNPV,log_B_IP_OWNPV", # }, # Inputs={ # "log_B_PT": fmath.log(F.PT), # "B_ETA": F.ETA, # "log_B_DIRA": fmath.log(1. +1.e-6 - F.BPVDIRA(pvs)), # "log_B_ENDVERTEX_CHI2": fmath.log(F.CHI2DOF), # "log_B_IPCHI2_OWNPV": fmath.log(F.BPVIPCHI2(pvs)), # "log_B_IP_OWNPV": fmath.log(F.BPVIP(pvs)), # }),*/ } ) Xi_variables += FC.HltTisTos(selection_type="Hlt1", trigger_lines=Hlt1_decisions, data=data) #Xi_variables += FC.HltTisTos(selection_type="Hlt2", trigger_lines=Hlt2_decisions, data=data) Xi_variables += FC.FlavourTaggingResults(all_tagging) Lambda0_variables = FunctorCollection( { #Kinematics "ID": F.PARTICLE_ID, "PT": F.PT, "ETA": F.ETA, "P": F.P, "SUMPT": F.SUM(F.PT), "MASS": F.MASS, "PX": F.PX, "PY": F.PY, "PZ": F.PZ, "DOCA_p_pi": F.DOCA(1, 2), #PV related "BPVDIRA": F.BPVDIRA(pvs), "BPVIP": F.BPVIP(pvs), "BPVIPCHI2": F.BPVIPCHI2(pvs), "BPVFD": F.BPVFD(pvs), "BPVFDCHI2": F.BPVFDCHI2(pvs), "MINIPCHI2": F.MINIPCHI2(pvs), "BPVX": F.BPVX(pvs), "BPVY": F.BPVY(pvs), "BPVZ": F.BPVZ(pvs), #SV related "CHI2DOF": F.CHI2DOF, "END_VX": F.END_VX, "END_VY": F.END_VY, "END_VZ": F.END_VZ, "END_VCHI2DOF": F.CHI2DOF @ F.ENDVERTEX, } ) fs_variables = FunctorCollection( { #Kinematics "ID": F.PARTICLE_ID, "PT": F.PT, "ETA": F.ETA, "PHI": F.PHI, "P": F.P, "MASS": F.MASS, #PV Related "CHI2DOF": F.CHI2DOF, "TRACK_GhostProb": F.GHOSTPROB, "MINIPCHI2": F.MINIPCHI2(pvs), "BPVIPCHI2": F.BPVIPCHI2(pvs), "PX": F.PX, "PY": F.PY, "PZ": F.PZ, #PID "hasRICH": F.PPHASRICH() @ F.PROTOPARTICLE(), "PIDK": F.PID_K, "PIDp": F.PID_P, "PIDe": F.PID_E, "PIDmu": F.PID_MU, "PIDpi": F.PID_PI, "isMuon": F.ISMUON, #ProbNN "ProbNNp": F.PROBNN_P, "ProbNNK": F.PROBNN_K, "ProbNNpi": F.PROBNN_PI, "ProbNNmu": F.PROBNN_MU, #Track Hit info "NHITS": F.VALUE_OR(-1) @ F.NHITS @ F.TRACK, "NVPHITS": F.VALUE_OR(-1) @ F.NVPHITS @ F.TRACK, # VeloPixel hits "NUTHITS": F.VALUE_OR(-1) @ F.NUTHITS @ F.TRACK, # UpstreamTracker hits "NFTHITS": F.VALUE_OR(-1) @ F.NFTHITS @ F.TRACK, # ForwardTracker hits "TRACKHASVELO": F.VALUE_OR(-1) @ F.TRACKHASVELO @ F.TRACK, } ) variables = { "Xi": Xi_variables, "Lambda0": Lambda0_variables, "P_lam": fs_variables, "Pi_lam": fs_variables, "Mu": fs_variables, } odin = get_odin() rec_summary = get_rec_summary() # define event level variables evt_variables = FunctorCollection({ "RUNNUMBER": F.RUNNUMBER(odin), "EVENTNUMBER": F.EVENTNUMBER(odin), "nVPClusters" : F.VALUE_OR(-1) @ F.RECSUMMARY_INFO( rec_summary, "nVPClusters"), "nFTClusters" : F.VALUE_OR(-1) @ F.RECSUMMARY_INFO( rec_summary, "nFTClusters"), "nPVs": F.VALUE_OR(-1) @ F.RECSUMMARY_INFO(rec_summary, "nPVs"), "nLongTracks": F.VALUE_OR(-1) @ F.RECSUMMARY_INFO(rec_summary, "nLongTracks"), "nVeloTracks": F.VALUE_OR(-1) @F.RECSUMMARY_INFO(rec_summary,"nVeloTracks"), }) evt_variables+=FC.SelectionInfo(selection_type="Hlt1", trigger_lines=Hlt1_decisions) evt_variables+=FC.SelectionInfo(selection_type="Hlt2", trigger_lines=Hlt2_decisions) funtuple = Funtuple( name=line, tuple_name="DecayTree", fields=fields, variables=variables, inputs=data, event_variables = evt_variables, store_multiple_cand_info=True ) algs = {line: [line_prefilter, require_pvs(pvs), funtuple]} return make_config(options, algs)