Skip to content
Snippets Groups Projects

Draft: [Not for merge] Bs2DsPi respruce validation

Closed James Connaughton requested to merge jconnaug/bs2dspi-respruce-test into master
1 unresolved thread
121 files
+ 329
3091
Compare changes
  • Side-by-side
  • Inline
Files
121
+ 282
0
 
 
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_BdToDsmPi_DsmToKpKmPim"
 
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_BdToDsmPi_DsmToKpKmPimDecision',
 
'Hlt2Topo2BodyDecision',
 
'Hlt2Topo3BodyDecision']
 
 
fields = {
 
"lab0": "[[B0]CC -> (D_s- -> K+ K- pi-) pi+]CC",
 
"lab1": "[[B0]CC -> (D_s- -> K+ K- pi-) ^pi+]CC",
 
"lab2": "[[B0]CC -> ^(D_s- -> K+ K- pi-) pi+]CC",
 
"lab3": "[[B0]CC -> (D_s- -> ^K+ K- pi-) pi+]CC",
 
"lab4": "[[B0]CC -> (D_s- -> K+ ^K- pi-) pi+]CC",
 
"lab5": "[[B0]CC -> (D_s- -> K+ K- ^pi-) pi+]CC",
 
}
 
 
pvs = get_pvs()
 
 
DTF_MassFitConsD = DecayTreeFitter(name="DTF_MassFitConsD",
 
input_particles=line_data,
 
mass_constraints=["D_s-"])
 
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_MassFitConsD_MASS": DTF_MassFitConsD(F.MASS),
 
"DTF_MassFitConsD_CHI2DOF": DTF_MassFitConsD(F.CHI2DOF), # track or vertex chi2/ndf
 
"DTF_MassFitConsD_P": DTF_MassFitConsD(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)),
 
}),
 
"MVAold": F.MVA(
 
MVAType="SigmaNet",
 
Config={
 
"File":
 
"paramfile://data/Hlt2B2OC_B_SigmaNet_Run3-v1.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. - 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