Skip to content
Snippets Groups Projects

Draft: [Not for merge] B2OC: Lb2LcPi respruce validation

Closed Maciej Artur Giza requested to merge mgiza-lb2lcpi-respruce-test into master
1 unresolved thread
4 files
+ 388
0
Compare changes
  • Side-by-side
  • Inline
Files
4
+ 259
0
# Based on:
# https://gitlab.cern.ch/lhcb/DaVinci/-/blob/v63r2/DaVinciExamples/python/DaVinciExamples/tupling/option_davinci_tupling_from_hlt2.py
import Functors as F
import FunTuple.functorcollections as FC
from FunTuple import FunctorCollection, FunTuple_Particles as Funtuple
from PyConf.reading import get_particles, get_pvs, get_rec_summary, get_odin
from GaudiKernel.SystemOfUnits import GeV
from RecoConf.algorithms_thor import ParticleFilter
from DaVinci.algorithms import create_lines_filter
from DaVinci import Options, make_config
from DaVinciMCTools import MCTruthAndBkgCat
from DecayTreeFitter import DecayTreeFitter
from Hlt2Conf.flavourTagging import run2_all_taggers
# specific for the B2OC SigmaNet
import Functors.math as fmath
import os
def alg_config(options: Options):
line = "Hlt2B2OC_LbToLcpPi_LcpToPKPi"
line_data = get_particles(f"/Event/Turbo/{line}/Particles")
my_filter = create_lines_filter("Hlt2Line_Filter",
lines=[f"{line}"])
Hlt1_decisions = [
"Hlt1TrackMVADecision",
"Hlt1TwoTrackMVADecision",
]
Hlt2_decisions = ['Hlt2B2OC_LbToLcpPi_LcpToPKPiDecision',
'Hlt2Topo2BodyDecision',
'Hlt2Topo3BodyDecision']
fields = {
'lab0': '[Lambda_b0 -> (Lambda_c+ -> p+ K- pi+) pi-]CC',
'lab1': '[Lambda_b0 -> (Lambda_c+ -> p+ K- pi+) ^pi-]CC',
'lab2': '[Lambda_b0 -> ^(Lambda_c+ -> p+ K- pi+) pi-]CC',
'lab3': '[Lambda_b0 -> (Lambda_c+ -> ^p+ K- pi+) pi-]CC',
'lab4': '[Lambda_b0 -> (Lambda_c+ -> p+ ^K- pi+) pi-]CC',
'lab5': '[Lambda_b0 -> (Lambda_c+ -> p+ K- ^pi+) pi-]CC'
}
pvs = get_pvs()
DTF_MassFitConsLc = DecayTreeFitter(
name="DTF_MassFitConsLc",
input_particles=line_data,
mass_constraints=["Lambda_c+"])
DTF_LifetimeFit = DecayTreeFitter(
name="DTF_LifetimeFit", input_particles=line_data, input_pvs=pvs)
# all_tagging = run2_all_taggers(line_data)
# define helper functors
get_child = F.CHILD(1, F.FORWARDARG0) # change here the index of the child
get_SV = F.ENDVERTEX @ F.FORWARDARG0
get_SV_pos = F.TOLINALG @ F.POSITION @ get_SV # only if composite (i.e. has vertex)
get_child_endvtx_pos = F.ENDVERTEX_POS @ get_child
get_fdvec_child = get_child_endvtx_pos - get_SV_pos
# define observables
IP_wrt_SV = F.IP.bind(get_SV_pos , get_child)
IPCHI2_wrt_SV = F.IPCHI2.bind(get_SV , get_child) # only if child is composite (i.e. has vertex)
FD_wrt_SV = F.MAGNITUDE @ get_fdvec_child
FDCHI2_wrt_SV = F.VTX_FDCHI2.bind(get_SV, get_child)
B_variables = FunctorCollection(
{
"ID": F.PARTICLE_ID,
"PT": F.PT,
"ETA": F.ETA,
"P": F.P,
"SUMPT": F.SUM(F.PT),
"MASS": F.MASS,
"BPVDIRA": F.BPVDIRA(pvs),
"CHI2DOF": F.CHI2DOF,
"BPVIPCHI2": F.BPVIPCHI2(pvs),
"BPVIP": F.BPVIP(pvs),
"BPVFDCHI2": F.BPVFDCHI2(pvs),
"BPVLTIME": F.BPVLTIME(pvs),
"BPVFD": F.BPVFD(pvs),
"CHILD1_IPwrtSV": IP_wrt_SV,
"CHILD1_IPCHI2wrtSV": IPCHI2_wrt_SV,
"CHILD1_FDwrtSV": FD_wrt_SV,
"CHILD1_FDCHI2wrtSV": FDCHI2_wrt_SV,
"DTF_MassFitConsLc_MASS": DTF_MassFitConsLc(F.MASS),
"DTF_MassFitConsLc_CHI2DOF": DTF_MassFitConsLc(F.CHI2DOF), # track or vertex chi2/ndf
"DTF_MassFitConsLc_P": DTF_MassFitConsLc(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,
"BPVX": F.BPVX(pvs),
"BPVY": F.BPVY(pvs),
"BPVZ": F.BPVZ(pvs),
"END_VX": F.END_VX,
"END_VY": F.END_VY,
"END_VZ": F.END_VZ,
"END_VCHI2DOF": F.CHI2DOF @ F.ENDVERTEX,
"BPVCHI2DOF": F.CHI2DOF @ F.BPV(pvs),
# 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)),
}),
}
)
B_variables+=FC.HltTisTos(selection_type="Hlt1", trigger_lines=Hlt1_decisions, data=line_data)
# B_variables+=FC.FlavourTaggingResults(all_tagging)
C_variables = FunctorCollection(
{
"ID": F.PARTICLE_ID,
"PT": F.PT,
"ETA": F.ETA,
"P": F.P,
"SUMPT": F.SUM(F.PT),
"MASS": F.MASS,
"DOCA12": F.DOCA(1, 2),
"DOCA13": F.DOCA(1, 3),
"DOCA23": F.DOCA(2, 3),
"BPVDIRA": F.BPVDIRA(pvs),
"CHI2DOF": F.CHI2DOF,
"BPVIP": F.BPVIP(pvs),
"BPVIPCHI2": F.BPVIPCHI2(pvs),
"BPVFD": F.BPVFD(pvs),
"BPVFDCHI2": F.BPVFDCHI2(pvs),
"MINIPCHI2": F.MINIPCHI2(pvs),
"PX": F.PX,
"PY": F.PY,
"PZ": F.PZ,
"BPVX": F.BPVX(pvs),
"BPVY": F.BPVY(pvs),
"BPVZ": F.BPVZ(pvs),
"END_VX": F.END_VX,
"END_VY": F.END_VY,
"END_VZ": F.END_VZ,
"END_VCHI2DOF": F.CHI2DOF @ F.ENDVERTEX,
}
)
fs_variables = FunctorCollection(
{
"ID": F.PARTICLE_ID,
"PT": F.PT,
"ETA": F.ETA,
"PHI": F.PHI,
"P": F.P,
"MASS": F.MASS,
"CHI2DOF": F.CHI2DOF,
"MINIPCHI2": F.MINIPCHI2(pvs),
"BPVIPCHI2": F.BPVIPCHI2(pvs),
"PX": F.PX,
"PY": F.PY,
"PZ": F.PZ,
"hasRICH": F.PPHASRICH() @ F.PROTOPARTICLE(),
"PIDK": F.PID_K,
"PIDp": F.PID_P,
"PIDe": F.PID_E,
"PIDmu": F.PID_MU,
"isMuon": F.ISMUON,
"TRACK_GhostProb": F.GHOSTPROB,
"ProbNNp": F.PROBNN_P,
"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 = {
"lab0": B_variables,
"lab1": fs_variables,
"lab2": C_variables,
"lab3": fs_variables,
"lab4": fs_variables,
"lab5": fs_variables,
}
if options.simulation:
# get configured "MCTruthAndBkgCatAlg" algorithm for HLT2 output
mctruth = MCTruthAndBkgCat(line_data)
# add helper lambda that configures a functor to get truth information
MCTRUTH = lambda func: F.MAP_INPUT(Functor=func, Relations=mctruth.MCAssocTable)
trueid_bkgcat_info = {
# Important note: specify an invalid value for integer functors if there exists no truth info.
# The invalid value for floating point functors is set to nan.
"TRUEID": F.VALUE_OR(0) @ MCTRUTH(F.PARTICLE_ID),
"TRUEKEY": F.VALUE_OR(-1) @ MCTRUTH(F.OBJECT_KEY),
#
"TRUEPT": MCTRUTH(F.PT),
"TRUEPX": MCTRUTH(F.PX),
"TRUEPY": MCTRUTH(F.PY),
"TRUEPZ": MCTRUTH(F.PZ),
"TRUEENERGY": MCTRUTH(F.ENERGY),
"TRUEP": MCTRUTH(F.P),
"TRUEFOURMOMENTUM": MCTRUTH(F.FOURMOMENTUM),
"BKGCAT": F.BKGCAT(Relations=mctruth.BkgCatTable),
}
for field in variables.keys():
variables[field] += FunctorCollection(trueid_bkgcat_info)
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)
# define FunTuple instance
my_tuple = Funtuple(
name="Tuple",
tuple_name="DecayTree",
fields=fields,
variables=variables,
event_variables=evt_variables,
inputs=line_data,
store_multiple_cand_info=True,
)
return make_config(options, [my_filter, my_tuple])
Loading