Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
AnalysisProductions
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
LHCb Data Packages
AnalysisProductions
Merge requests
!1524
B PV association
Code
Review changes
Check out branch
Download
Patches
Plain diff
Merged
B PV association
pv
into
master
Overview
4
Commits
20
Pipelines
1
Changes
6
3 unresolved threads
Hide all comments
Merged
Abhijit Mathad
requested to merge
pv
into
master
7 months ago
Overview
4
Commits
20
Pipelines
1
Changes
6
3 unresolved threads
Hide all comments
Expand
Fixes the bug that was found in the DV script of the previous
!1514 (merged)
.
0
0
Merge request reports
Compare
master
master (base)
and
latest version
latest version
8eb05eee
20 commits,
7 months ago
6 files
+
892
−
0
Inline
Compare changes
Side-by-side
Inline
Show whitespace changes
Show one file at a time
Files
6
Search (e.g. *.vue) (Ctrl+P)
pvassoc/dv.py
0 → 100755
+
398
−
0
Options
###############################################################################
# (c) Copyright 2024 CERN for the benefit of the LHCb Collaboration #
# #
# This software is distributed under the terms of the GNU General Public #
# Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". #
# #
# In applying this licence, CERN does not waive the privileges and immunities #
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
###############################################################################
from
PyConf.reading
import
get_pvs
,
get_particles
# type: ignore[import]
import
Functors
as
F
# type: ignore[import]
from
FunTuple
import
FunTuple_Event
# type: ignore[import]
from
DaVinci.algorithms
import
create_lines_filter
# type: ignore[import]
import
FunTuple.functorcollections
as
FC
# type: ignore[import]
from
DaVinciMCTools
import
MCTruthAndBkgCat
# type: ignore[import]
from
Hlt2Conf.algorithms_thor
import
ParticleFilter
# type: ignore[import]
from
PyConf.Algorithms
import
VoidFilter
# type: ignore[import]
import
Functors.math
as
fmath
# type: ignore[import]
from
PyConf.Algorithms
import
FlattenDecayTree
# type: ignore[import]
from
GaudiKernel
import
SystemOfUnits
# type: ignore[import]
from
RecoConf.reconstruction_objects
import
make_tracks
# type: ignore[import]
#Variables for pvs
ALLPV_KEY
=
lambda
Vertices
:
F
.
MAP
(
F
.
OBJECT_KEY
)
@
F
.
TES
(
Vertices
)
ALLPV_CHI2
=
lambda
Vertices
:
F
.
MAP
(
F
.
CHI2
)
@
F
.
TES
(
Vertices
)
ALLPV_NDOF
=
lambda
Vertices
:
F
.
MAP
(
F
.
NDOF
)
@
F
.
TES
(
Vertices
)
# Can infer nVelo tracks from this
ALLPV_X
=
lambda
Vertices
:
F
.
MAP
(
F
.
X_COORDINATE
@
F
.
POSITION
)
@
F
.
TES
(
Vertices
)
ALLPV_Y
=
lambda
Vertices
:
F
.
MAP
(
F
.
Y_COORDINATE
@
F
.
POSITION
)
@
F
.
TES
(
Vertices
)
ALLPV_Z
=
lambda
Vertices
:
F
.
MAP
(
F
.
Z_COORDINATE
@
F
.
POSITION
)
@
F
.
TES
(
Vertices
)
ALLPV_POSERR
=
lambda
Vertices
,
indx_i
:
F
.
MAP
(
fmath
.
sqrt
(
F
.
CALL
(
indx_i
,
indx_i
))
@
F
.
POS_COV_MATRIX
)
@
F
.
TES
(
Vertices
)
#Variables for particles
ALLPART_KEY
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
F
.
OBJECT_KEY
)
@
F
.
TES
(
particles
)
#to differentiate from particles forming B candidate
ALLPART_Q
=
lambda
particles
:
F
.
MAP
(
F
.
CHARGE
)
@
F
.
TES
(
particles
)
ALLPART_PX
=
lambda
particles
:
F
.
MAP
(
F
.
PX
)
@
F
.
TES
(
particles
)
ALLPART_PY
=
lambda
particles
:
F
.
MAP
(
F
.
PY
)
@
F
.
TES
(
particles
)
ALLPART_PZ
=
lambda
particles
:
F
.
MAP
(
F
.
PZ
)
@
F
.
TES
(
particles
)
ALLPART_MOMERR
=
lambda
particles
,
indx_i
:
F
.
MAP
(
F
.
CALL
(
indx_i
,
indx_i
)
@
F
.
THREE_MOM_COV_MATRIX
)
@
F
.
TES
(
particles
)
ALLPART_ENERGY
=
lambda
particles
:
F
.
MAP
(
F
.
ENERGY
)
@
F
.
TES
(
particles
)
ALLPART_MASS
=
lambda
particles
:
F
.
MAP
(
F
.
MASS
)
@
F
.
TES
(
particles
)
ALLPART_ETA
=
lambda
particles
:
F
.
MAP
(
F
.
ETA
)
@
F
.
TES
(
particles
)
ALLPART_PHI
=
lambda
particles
:
F
.
MAP
(
F
.
PHI
)
@
F
.
TES
(
particles
)
ALLPART_PIDPI
=
lambda
particles
:
F
.
MAP
(
F
.
PID_PI
)
@
F
.
TES
(
particles
)
ALLPART_PIDK
=
lambda
particles
:
F
.
MAP
(
F
.
PID_K
)
@
F
.
TES
(
particles
)
ALLPART_PIDP
=
lambda
particles
:
F
.
MAP
(
F
.
PID_P
)
@
F
.
TES
(
particles
)
ALLPART_PIDE
=
lambda
particles
:
F
.
MAP
(
F
.
PID_E
)
@
F
.
TES
(
particles
)
ALLPART_PIDMU
=
lambda
particles
:
F
.
MAP
(
F
.
PID_MU
)
@
F
.
TES
(
particles
)
#P -> Proto -> Track
ALLPART_TRACK_CHI2
=
lambda
particles
:
F
.
MAP
(
F
.
CHI2
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_TRACK_NDOF
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
F
.
NDOF
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_TRACK_TYPE
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
F
.
CAST_TO_INT
@
F
.
TRACKTYPE
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_TRACK_GHOSTPROB
=
lambda
particles
:
F
.
MAP
(
F
.
GHOSTPROB
)
@
F
.
TES
(
particles
)
#get the BPV information for particles
ALLPART_BPV_KEY
=
lambda
particles
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
F
.
OBJECT_KEY
@
F
.
BPV
(
pvs
))
@
F
.
TES
(
particles
)
ALLPART_BPV_X
=
lambda
particles
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVX
(
pvs
))
@
F
.
TES
(
particles
)
ALLPART_BPV_Y
=
lambda
particles
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVY
(
pvs
))
@
F
.
TES
(
particles
)
ALLPART_BPV_Z
=
lambda
particles
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVZ
(
pvs
))
@
F
.
TES
(
particles
)
ALLPART_BPV_IP
=
lambda
particles
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVIP
(
pvs
))
@
F
.
TES
(
particles
)
ALLPART_BPV_IPCHI2
=
lambda
particles
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVIPCHI2
(
pvs
))
@
F
.
TES
(
particles
)
## particle has track but not a closest to beam state, so throws an error (Should this be an error at all?)
ALLPART_CLOSESTTOBEAM_X
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
X_COORDINATE
@
F
.
POSITION
@
F
.
STATE_AT
(
"
ClosestToBeam
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_CLOSESTTOBEAM_Y
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
Y_COORDINATE
@
F
.
POSITION
@
F
.
STATE_AT
(
"
ClosestToBeam
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_CLOSESTTOBEAM_TX
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
TX
@
F
.
STATE_AT
(
"
ClosestToBeam
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_CLOSESTTOBEAM_TY
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
TY
@
F
.
STATE_AT
(
"
ClosestToBeam
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_CLOSESTTOBEAM_QOP
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
QOVERP
@
F
.
STATE_AT
(
"
ClosestToBeam
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_CLOSESTTOBEAM_STATEERR
=
lambda
particles
,
indx_i
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
CALL
(
indx_i
,
indx_i
)
@
F
.
TRACK_COVARIANCE
@
F
.
STATE_AT
(
"
ClosestToBeam
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_X
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
X_COORDINATE
@
F
.
POSITION
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_Y
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
Y_COORDINATE
@
F
.
POSITION
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_Z
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
Z_COORDINATE
@
F
.
POSITION
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_TX
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
TX
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_TY
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
TY
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_QOP
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
QOVERP
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
ALLPART_FIRSTMEAS_STATEERR
=
lambda
particles
,
indx_i
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
CALL
(
indx_i
,
indx_i
)
@
F
.
TRACK_COVARIANCE
@
F
.
STATE_AT
(
"
FirstMeasurement
"
)
@
F
.
TRACK
)
@
F
.
TES
(
particles
)
### particle has no endut state, so throws an error (should this be an error at all?)
#ALLPART_ENDUT_X = lambda particles: F.MAP(F.VALUE_OR(F.NaN) @ F.X_COORDINATE @ F.POSITION @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#ALLPART_ENDUT_Y = lambda particles: F.MAP(F.VALUE_OR(F.NaN) @ F.Y_COORDINATE @ F.POSITION @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#ALLPART_ENDUT_Z = lambda particles: F.MAP(F.VALUE_OR(F.NaN) @ F.Z_COORDINATE @ F.POSITION @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#ALLPART_ENDUT_TX = lambda particles: F.MAP(F.VALUE_OR(F.NaN) @ F.TX @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#ALLPART_ENDUT_TY = lambda particles: F.MAP(F.VALUE_OR(F.NaN) @ F.TY @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#ALLPART_ENDUT_QOP = lambda particles: F.MAP(F.VALUE_OR(F.NaN) @ F.QOVERP @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#ALLPART_ENDUT_STATEERR = lambda particles, indx_i: F.MAP(F.VALUE_OR(F.NaN) @ F.CALL(indx_i, indx_i) @ F.TRACK_COVARIANCE @ F.STATE_AT("EndUT") @ F.TRACK) @ F.TES(particles)
#P -> MCP
ALLPART_MC_ISPROMPT
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
mctruth
(
F
.
MC_ISPROMPT
()))
@
F
.
TES
(
particles
)
ALLPART_TRUE_PV_X
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MC_PV_VX
))
@
F
.
TES
(
particles
)
#for association of PV <-> MCPV
ALLPART_TRUE_PV_Y
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MC_PV_VY
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_PV_Z
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MC_PV_VZ
))
@
F
.
TES
(
particles
)
#P -> LONG LIVED ANCESTOR (Helpful to find which PV has produced B using MCPV <-> PV association)
## 10^-15 seconds is between the lifetimes of the pi0 (considered prompt) and the tau (nonprompt).
LONGLIVED_ANCESTOR
=
F
.
MC_FIRST_LONGLIVED_ANCESTOR
(
MinLifetime
=
1e-7
*
SystemOfUnits
.
ns
)
ALLPART_LONGLIVED_ANCESTOR_ID
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
0
)
@
mctruth
(
F
.
PARTICLE_ID
@
LONGLIVED_ANCESTOR
))
@
F
.
TES
(
particles
)
ALLPART_LONGLIVED_ANCESTOR_KEY
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
mctruth
(
F
.
OBJECT_KEY
@
LONGLIVED_ANCESTOR
))
@
F
.
TES
(
particles
)
#the following we don't need (but keep commented out in case we do)
#ALLPART_LONGLIVED_ANCESTOR_PVX = lambda particles, mctruth: F.MAP(F.VALUE_OR(F.NaN) @ mctruth(F.MC_PV_VX @ LONGLIVED_ANCESTOR)) @ F.TES(particles)
#ALLPART_LONGLIVED_ANCESTOR_PVY = lambda particles, mctruth: F.MAP(F.VALUE_OR(F.NaN) @ mctruth(F.MC_PV_VY @ LONGLIVED_ANCESTOR)) @ F.TES(particles)
#ALLPART_LONGLIVED_ANCESTOR_PVZ = lambda particles, mctruth: F.MAP(F.VALUE_OR(F.NaN) @ mctruth(F.MC_PV_VZ @ LONGLIVED_ANCESTOR)) @ F.TES(particles)
ALLPART_TRUE_ID
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
0
)
@
mctruth
(
F
.
PARTICLE_ID
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_KEY
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
mctruth
(
F
.
OBJECT_KEY
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_PX
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
PX
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_PY
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
PY
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_PZ
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
PZ
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_ENERGY
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
ENERGY
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_MASS
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MASS
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_ORGIN_KEY
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
mctruth
(
F
.
OBJECT_KEY
@
F
.
MC_PRIMARYVERTEX
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_ORGIN_X
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
ORIGIN_VX
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_ORGIN_Y
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
ORIGIN_VY
))
@
F
.
TES
(
particles
)
ALLPART_TRUE_ORGIN_Z
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
ORIGIN_VZ
))
@
F
.
TES
(
particles
)
ALLPART_MOTHER_ID
=
lambda
particles
,
ngen
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
0
)
@
mctruth
(
F
.
MC_MOTHER
(
ngen
,
F
.
PARTICLE_ID
)))
@
F
.
TES
(
particles
)
ALLPART_MOTHER_KEY
=
lambda
particles
,
ngen
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
mctruth
(
F
.
MC_MOTHER
(
ngen
,
F
.
OBJECT_KEY
)))
@
F
.
TES
(
particles
)
ALLPART_ID
=
lambda
particles
:
F
.
MAP
(
F
.
VALUE_OR
(
0
)
@
F
.
PARTICLE_ID
)
@
F
.
TES
(
particles
)
#ALLPART_HISTORY = lambda particles: F.MAP(F.VALUE_OR(-1) @ F.CAST_TO_INT @ F.TRACKHISTORY @ F.TRACK) @ F.TES(particles)
#ALLPART_FLAG = lambda particles: F.MAP(F.VALUE_OR(-1) @ F.CAST_TO_INT @ F.TRACKFLAG @ F.TRACK) @ F.TES(particles)
#Variables for particles
ALLB_ID
=
lambda
particles
:
F
.
MAP
(
F
.
PARTICLE_ID
)
@
F
.
TES
(
particles
)
ALLB_KEY
=
lambda
particles
:
F
.
MAP
(
F
.
OBJECT_KEY
)
@
F
.
TES
(
particles
)
ALLB_ENDVTX_CHI2
=
lambda
particles
:
F
.
MAP
(
F
.
CHI2
@
F
.
ENDVERTEX
)
@
F
.
TES
(
particles
)
ALLB_ENDVTX_NDOF
=
lambda
particles
:
F
.
MAP
(
F
.
NDOF
@
F
.
ENDVERTEX
)
@
F
.
TES
(
particles
)
ALLB_ENDVTX_X
=
lambda
particles
:
F
.
MAP
(
F
.
END_VX
)
@
F
.
TES
(
particles
)
ALLB_ENDVTX_Y
=
lambda
particles
:
F
.
MAP
(
F
.
END_VY
)
@
F
.
TES
(
particles
)
ALLB_ENDVTX_Z
=
lambda
particles
:
F
.
MAP
(
F
.
END_VZ
)
@
F
.
TES
(
particles
)
ALLB_ENDVTX_POSERR
=
lambda
particles
,
indx_i
:
F
.
MAP
(
fmath
.
sqrt
(
F
.
CALL
(
indx_i
,
indx_i
))
@
F
.
POS_COV_MATRIX
@
F
.
ENDVERTEX
)
@
F
.
TES
(
particles
)
ALLB_PX
=
lambda
particles
:
F
.
MAP
(
F
.
PX
)
@
F
.
TES
(
particles
)
ALLB_PY
=
lambda
particles
:
F
.
MAP
(
F
.
PY
)
@
F
.
TES
(
particles
)
ALLB_PZ
=
lambda
particles
:
F
.
MAP
(
F
.
PZ
)
@
F
.
TES
(
particles
)
ALLB_MOMERR
=
lambda
particles
,
indx_i
:
F
.
MAP
(
F
.
CALL
(
indx_i
,
indx_i
)
@
F
.
THREE_MOM_COV_MATRIX
)
@
F
.
TES
(
particles
)
ALLB_ENERGY
=
lambda
particles
:
F
.
MAP
(
F
.
ENERGY
)
@
F
.
TES
(
particles
)
ALLB_MASS
=
lambda
particles
:
F
.
MAP
(
F
.
MASS
)
@
F
.
TES
(
particles
)
ALLB_ETA
=
lambda
particles
:
F
.
MAP
(
F
.
ETA
)
@
F
.
TES
(
particles
)
ALLB_PHI
=
lambda
particles
:
F
.
MAP
(
F
.
PHI
)
@
F
.
TES
(
particles
)
#P -> MCP
ALLB_TRUE_ID
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
0
)
@
mctruth
(
F
.
PARTICLE_ID
))
@
F
.
TES
(
particles
)
ALLB_TRUE_KEY
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
mctruth
(
F
.
OBJECT_KEY
))
@
F
.
TES
(
particles
)
ALLB_TRUE_PV_X
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MC_PV_VX
))
@
F
.
TES
(
particles
)
#for association of PV <-> MCPV
ALLB_TRUE_PV_Y
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MC_PV_VY
))
@
F
.
TES
(
particles
)
ALLB_TRUE_PV_Z
=
lambda
particles
,
mctruth
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
mctruth
(
F
.
MC_PV_VZ
))
@
F
.
TES
(
particles
)
#the following we don't need (but keep commented out in case we do)
#ALLB_TRUE_CHILD1_ID = lambda particles, mctruth: F.MAP(F.VALUE_OR(0) @ mctruth(F.PARTICLE_ID) @ F.CHILD(1, F.FORWARDARGS)) @ F.TES(particles) #D*-
#ALLB_TRUE_CHILD11_ID = lambda particles, mctruth: F.MAP(F.VALUE_OR(0) @ mctruth(F.PARTICLE_ID) @ F.CHILD(1, F.FORWARDARGS) @ F.CHILD(1, F.FORWARDARGS)) @ F.TES(particles) #D0
#ALLB_TRUE_CHILD12_ID = lambda particles, mctruth: F.MAP(F.VALUE_OR(0) @ mctruth(F.PARTICLE_ID) @ F.CHILD(2, F.FORWARDARGS) @ F.CHILD(1, F.FORWARDARGS)) @ F.TES(particles) #pi
#ALLB_TRUE_CHILD111_ID = lambda particles, mctruth: F.MAP(F.VALUE_OR(0) @ mctruth(F.PARTICLE_ID) @ F.CHILD(1, F.FORWARDARGS) @ F.CHILD(1, F.FORWARDARGS) @ F.CHILD(1, F.FORWARDARGS)) @ F.TES(particles) #K
#ALLB_TRUE_CHILD112_ID = lambda particles, mctruth: F.MAP(F.VALUE_OR(0) @ mctruth(F.PARTICLE_ID) @ F.CHILD(2, F.FORWARDARGS) @ F.CHILD(1, F.FORWARDARGS) @ F.CHILD(1, F.FORWARDARGS)) @ F.TES(particles) #pi
#ALLB_TRUE_CHILD2_ID = lambda particles, mctruth: F.MAP(F.VALUE_OR(0) @ mctruth(F.PARTICLE_ID) @ F.CHILD(2, F.FORWARDARGS)) @ F.TES(particles) #mu
#velo tracks
ALLVELOTRACKS_ETA
=
lambda
tracks
:
F
.
MAP
(
F
.
ETA
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_PHI
=
lambda
tracks
:
F
.
MAP
(
F
.
PHI
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_X
=
lambda
tracks
:
F
.
MAP
(
F
.
X_COORDINATE
@
F
.
POSITION
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_Y
=
lambda
tracks
:
F
.
MAP
(
F
.
Y_COORDINATE
@
F
.
POSITION
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_Z
=
lambda
tracks
:
F
.
MAP
(
F
.
Z_COORDINATE
@
F
.
POSITION
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_TX
=
lambda
tracks
:
F
.
MAP
(
F
.
TX
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_TY
=
lambda
tracks
:
F
.
MAP
(
F
.
TY
)
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_BPV_KEY
=
lambda
tracks
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
-
1
)
@
F
.
OBJECT_KEY
@
F
.
BPV
(
pvs
))
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_BPV_X
=
lambda
tracks
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVX
(
pvs
))
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_BPV_Y
=
lambda
tracks
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVY
(
pvs
))
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_BPV_Z
=
lambda
tracks
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVZ
(
pvs
))
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_BPV_IP
=
lambda
tracks
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVIP
(
pvs
))
@
F
.
TES
(
tracks
)
ALLVELOTRACKS_BPV_IPCHI2
=
lambda
tracks
,
pvs
:
F
.
MAP
(
F
.
VALUE_OR
(
F
.
NaN
)
@
F
.
BPVIPCHI2
(
pvs
))
@
F
.
TES
(
tracks
)
##throw as error about pointers
#ALLVELOTRACKS_FIRSTMEAS_X = lambda tracks: F.MAP(F.VALUE_OR(F.NaN) @ F.X_COORDINATE @ F.POSITION @ F.STATE_AT("FirstMeasurement")) @ F.TES(tracks)
#ALLVELOTRACKS_FIRSTMEAS_Y = lambda tracks: F.MAP(F.VALUE_OR(F.NaN) @ F.Y_COORDINATE @ F.POSITION @ F.STATE_AT("FirstMeasurement")) @ F.TES(tracks)
#ALLVELOTRACKS_FIRSTMEAS_Z = lambda tracks: F.MAP(F.VALUE_OR(F.NaN) @ F.Z_COORDINATE @ F.POSITION @ F.STATE_AT("FirstMeasurement")) @ F.TES(tracks)
#ALLVELOTRACKS_POSERR = lambda tracks, indx_i: F.MAP(F.VALUE_OR(F.NaN) @ F.CALL(indx_i, indx_i) @ F.TRACK_COVARIANCE @ F.STATE_AT("FirstMeasurement")) @ F.TES(tracks)
#ALLVELOTRACKS_ENDVELO_X = lambda tracks: F.MAP(F.VALUE_OR(F.NaN) @ F.X_COORDINATE @ F.POSITION @ F.STATE_AT("EndVelo")) @ F.TES(tracks)
#ALLVELOTRACKS_ENDVELO_Y = lambda tracks: F.MAP(F.VALUE_OR(F.NaN) @ F.Y_COORDINATE @ F.POSITION @ F.STATE_AT("EndVelo")) @ F.TES(tracks)
#ALLVELOTRACKS_ENDVELO_Z = lambda tracks: F.MAP(F.VALUE_OR(F.NaN) @ F.Z_COORDINATE @ F.POSITION @ F.STATE_AT("EndVelo")) @ F.TES(tracks)
#ALLVELOTRACKS_ENDVELO_POSERR = lambda tracks, indx_i: F.MAP(F.VALUE_OR(F.NaN) @ F.CALL(indx_i, indx_i) @ F.TRACK_COVARIANCE @ F.STATE_AT("EndVelo")) @ F.TES(tracks)
def
get_all_part_vars
(
evt_vars
,
particles
,
pvs
,
MCTRUTH_parts
,
index_name
,
suffix
=
'
PARTS
'
,
is_long
=
False
):
evt_vars
[
f
'
ALL
{
suffix
}
_ID[
{
index_name
}
]
'
]
=
ALLPART_ID
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_KEY[
{
index_name
}
]
'
]
=
ALLPART_KEY
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_Q[
{
index_name
}
]
'
]
=
ALLPART_Q
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PX[
{
index_name
}
]
'
]
=
ALLPART_PX
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PY[
{
index_name
}
]
'
]
=
ALLPART_PY
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PZ[
{
index_name
}
]
'
]
=
ALLPART_PZ
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PXERR[
{
index_name
}
]
'
]
=
ALLPART_MOMERR
(
particles
,
0
)
evt_vars
[
f
'
ALL
{
suffix
}
_PYERR[
{
index_name
}
]
'
]
=
ALLPART_MOMERR
(
particles
,
1
)
evt_vars
[
f
'
ALL
{
suffix
}
_PZERR[
{
index_name
}
]
'
]
=
ALLPART_MOMERR
(
particles
,
2
)
evt_vars
[
f
'
ALL
{
suffix
}
_MASS[
{
index_name
}
]
'
]
=
ALLPART_MASS
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_ENERGY[
{
index_name
}
]
'
]
=
ALLPART_ENERGY
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_ETA[
{
index_name
}
]
'
]
=
ALLPART_ETA
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PHI[
{
index_name
}
]
'
]
=
ALLPART_PHI
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PIDPI[
{
index_name
}
]
'
]
=
ALLPART_PIDPI
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PIDK[
{
index_name
}
]
'
]
=
ALLPART_PIDK
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PIDP[
{
index_name
}
]
'
]
=
ALLPART_PIDP
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PIDE[
{
index_name
}
]
'
]
=
ALLPART_PIDE
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_PIDMU[
{
index_name
}
]
'
]
=
ALLPART_PIDMU
(
particles
)
#P -> Proto -> Track
evt_vars
[
f
'
ALL
{
suffix
}
_TRACK_CHI2[
{
index_name
}
]
'
]
=
ALLPART_TRACK_CHI2
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRACK_NDOF[
{
index_name
}
]
'
]
=
ALLPART_TRACK_NDOF
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRACK_TYPE[
{
index_name
}
]
'
]
=
ALLPART_TRACK_TYPE
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRACK_GHOSTPROB[
{
index_name
}
]
'
]
=
ALLPART_TRACK_GHOSTPROB
(
particles
)
# BPV information
evt_vars
[
f
'
ALL
{
suffix
}
_BPV_KEY[
{
index_name
}
]
'
]
=
ALLPART_BPV_KEY
(
particles
,
pvs
)
evt_vars
[
f
'
ALL
{
suffix
}
_BPV_X[
{
index_name
}
]
'
]
=
ALLPART_BPV_X
(
particles
,
pvs
)
evt_vars
[
f
'
ALL
{
suffix
}
_BPV_Y[
{
index_name
}
]
'
]
=
ALLPART_BPV_Y
(
particles
,
pvs
)
evt_vars
[
f
'
ALL
{
suffix
}
_BPV_Z[
{
index_name
}
]
'
]
=
ALLPART_BPV_Z
(
particles
,
pvs
)
evt_vars
[
f
'
ALL
{
suffix
}
_BPV_IP[
{
index_name
}
]
'
]
=
ALLPART_BPV_IP
(
particles
,
pvs
)
evt_vars
[
f
'
ALL
{
suffix
}
_BPV_IPCHI2[
{
index_name
}
]
'
]
=
ALLPART_BPV_IPCHI2
(
particles
,
pvs
)
# particle has track but not a closest to beam state, so throws an error (Should this be an error at all?)
if
is_long
:
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_X[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_X
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_Y[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_Y
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_TX[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_TX
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_TY[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_TY
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_QOP[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_QOP
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_XERR[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_STATEERR
(
particles
,
0
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_YERR[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_STATEERR
(
particles
,
1
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_TXERR[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_STATEERR
(
particles
,
2
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_TYERR[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_STATEERR
(
particles
,
3
)
evt_vars
[
f
'
ALL
{
suffix
}
_CLOSESTTOBEAM_QOPERR[
{
index_name
}
]
'
]
=
ALLPART_CLOSESTTOBEAM_STATEERR
(
particles
,
4
)
# store first measurement
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_X[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_X
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_Y[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_Y
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_Z[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_Z
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_TX[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_TX
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_TY[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_TY
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_QOP[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_QOP
(
particles
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_XERR[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_STATEERR
(
particles
,
0
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_YERR[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_STATEERR
(
particles
,
1
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_TXERR[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_STATEERR
(
particles
,
2
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_TYERR[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_STATEERR
(
particles
,
3
)
evt_vars
[
f
'
ALL
{
suffix
}
_FIRSTMEAS_QOPERR[
{
index_name
}
]
'
]
=
ALLPART_FIRSTMEAS_STATEERR
(
particles
,
4
)
#P -> MCP
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_ID[
{
index_name
}
]
'
]
=
ALLPART_TRUE_ID
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_KEY[
{
index_name
}
]
'
]
=
ALLPART_TRUE_KEY
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_PX[
{
index_name
}
]
'
]
=
ALLPART_TRUE_PX
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_PY[
{
index_name
}
]
'
]
=
ALLPART_TRUE_PY
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_PZ[
{
index_name
}
]
'
]
=
ALLPART_TRUE_PZ
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_ENERGY[
{
index_name
}
]
'
]
=
ALLPART_TRUE_ENERGY
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_MASS[
{
index_name
}
]
'
]
=
ALLPART_TRUE_MASS
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MC_ISPROMPT[
{
index_name
}
]
'
]
=
ALLPART_MC_ISPROMPT
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_PV_X[
{
index_name
}
]
'
]
=
ALLPART_TRUE_PV_X
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_PV_Y[
{
index_name
}
]
'
]
=
ALLPART_TRUE_PV_Y
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_PV_Z[
{
index_name
}
]
'
]
=
ALLPART_TRUE_PV_Z
(
particles
,
MCTRUTH_parts
)
#P -> LONG LIVED ANCESTOR
evt_vars
[
f
'
ALL
{
suffix
}
_LONGLIVED_ANCESTOR_ID[
{
index_name
}
]
'
]
=
ALLPART_LONGLIVED_ANCESTOR_ID
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_LONGLIVED_ANCESTOR_KEY[
{
index_name
}
]
'
]
=
ALLPART_LONGLIVED_ANCESTOR_KEY
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_ORGIN_KEY[
{
index_name
}
]
'
]
=
ALLPART_TRUE_ORGIN_KEY
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_ORGIN_X[
{
index_name
}
]
'
]
=
ALLPART_TRUE_ORGIN_X
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_ORGIN_Y[
{
index_name
}
]
'
]
=
ALLPART_TRUE_ORGIN_Y
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_TRUE_ORGIN_Z[
{
index_name
}
]
'
]
=
ALLPART_TRUE_ORGIN_Z
(
particles
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MOTHER_1_ID[
{
index_name
}
]
'
]
=
ALLPART_MOTHER_ID
(
particles
,
1
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MOTHER_1_KEY[
{
index_name
}
]
'
]
=
ALLPART_MOTHER_KEY
(
particles
,
1
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MOTHER_2_ID[
{
index_name
}
]
'
]
=
ALLPART_MOTHER_ID
(
particles
,
2
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MOTHER_2_KEY[
{
index_name
}
]
'
]
=
ALLPART_MOTHER_KEY
(
particles
,
2
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MOTHER_3_ID[
{
index_name
}
]
'
]
=
ALLPART_MOTHER_ID
(
particles
,
3
,
MCTRUTH_parts
)
evt_vars
[
f
'
ALL
{
suffix
}
_MOTHER_3_KEY[
{
index_name
}
]
'
]
=
ALLPART_MOTHER_KEY
(
particles
,
3
,
MCTRUTH_parts
)
#evt_vars[f'ALL{suffix}_HISTORY[{index_name}]'] = ALLPART_HISTORY(particles)
#evt_vars[f'ALL{suffix}_FLAG[{index_name}]'] = ALLPART_FLAG(particles)
def
get_user_algs
(
decay_channel
):
"""
decay_channel: decay channel to be used in the lines.
Options: DstMu, DstTau_Lep, DstTau_Had, JpsiK_E, JpsiK_Mu
"""
#line name
line_name
=
f
'
Hlt2SLB_BTo
{
decay_channel
}
'
#Run over events that have fired the line
my_filter
=
create_lines_filter
(
name
=
"
Filter
"
,
lines
=
[
line_name
])
#get Bs and particles
Bs
=
get_particles
(
f
"
/Event/HLT2/
{
line_name
}
/Particles
"
)
long_particles
=
get_particles
(
f
"
/Event/HLT2/
{
line_name
}
/ExtraLongPions/Particles
"
)
down_particles
=
get_particles
(
f
"
/Event/HLT2/
{
line_name
}
/ExtraDownPions/Particles
"
)
up_particles
=
get_particles
(
f
"
/Event/HLT2/
{
line_name
}
/ExtraUpPions/Particles
"
)
#get MCTRUTH for Bs
MCTRUTH_Bs
=
MCTruthAndBkgCat
(
Bs
,
name
=
'
MCTRUTH_Bs
'
)
#get MCTRUTH for particles
MCTRUTH_long_parts
=
MCTruthAndBkgCat
(
long_particles
,
name
=
'
MCTRUTHLONG_extra
'
)
MCTRUTH_down_parts
=
MCTruthAndBkgCat
(
down_particles
,
name
=
'
MCTRUTHDOWN_extra
'
)
MCTRUTH_up_parts
=
MCTruthAndBkgCat
(
up_particles
,
name
=
'
MCTRUTHUP_extra
'
)
#get true id of B candidate (hepful to run over events that have a true Bcand)
if
decay_channel
==
'
DstMu
'
or
decay_channel
==
'
DstTau_Lep
'
:
#Bd -> D*- mu+ nu; D*- -> D0 pi-; D0 -> K pi
#Bd -> D*- tau+ nu; D*- -> D0 pi-; D0 -> K pi and tau -> mu nu nu
B_ID
=
511
elif
decay_channel
==
'
D0Tau_Had
'
or
decay_channel
==
'
JpsiK_E
'
or
decay_channel
==
'
JpsiK_Mu
'
:
#Bu -> D*- tau+ nu; D*- -> D0 pi-; D0 -> K pi and tau -> 3pi
#Bu -> Jpsi K; Jpsi -> mu mu
B_ID
=
521
else
:
raise
ValueError
(
f
"
Invalid decay channel
{
decay_channel
}
"
)
#run over events that have a true Bcand
cut_event
=
F
.
MAP_ANY_OF
(
F
.
VALUE_OR
(
0
)
@
MCTRUTH_Bs
(
F
.
ABS
@
F
.
PARTICLE_ID
)
==
B_ID
)
@
F
.
TES
(
Bs
)
truth_filter_event
=
VoidFilter
(
name
=
'
EventTruthFilter
'
,
Cut
=
cut_event
)
#filter Bcands
cut_B
=
F
.
VALUE_OR
(
0
)
@
MCTRUTH_Bs
(
F
.
ABS
@
F
.
PARTICLE_ID
)
==
B_ID
Bcands
=
ParticleFilter
(
Input
=
Bs
,
Cut
=
F
.
FILTER
(
cut_B
),
name
=
'
signalB
'
)
#filter the B candidates
#get TES location of all descendants
all_descendants
=
FlattenDecayTree
(
InputParticles
=
Bcands
,
name
=
"
FlattenedDecayTree
"
).
OutputParticles
all_basics
=
ParticleFilter
(
all_descendants
,
F
.
FILTER
(
F
.
ISBASICPARTICLE
),
name
=
"
AllBasics
"
)
#get velo tracks
velo_tracks
=
make_tracks
(
'
VeloTracks
'
)
#get pvs
pvs
=
get_pvs
()
#get global event variables
evt_vars
=
FC
.
RecSummary
()
#get pv variables
evt_vars
[
'
ALLPV_CHI2[pv_indx]
'
]
=
ALLPV_CHI2
(
pvs
)
evt_vars
[
'
ALLPV_NDOF[pv_indx]
'
]
=
ALLPV_NDOF
(
pvs
)
evt_vars
[
'
ALLPV_X[pv_indx]
'
]
=
ALLPV_X
(
pvs
)
evt_vars
[
'
ALLPV_Y[pv_indx]
'
]
=
ALLPV_Y
(
pvs
)
evt_vars
[
'
ALLPV_Z[pv_indx]
'
]
=
ALLPV_Z
(
pvs
)
evt_vars
[
'
ALLPV_XERR[pv_indx]
'
]
=
ALLPV_POSERR
(
pvs
,
0
)
evt_vars
[
'
ALLPV_YERR[pv_indx]
'
]
=
ALLPV_POSERR
(
pvs
,
1
)
evt_vars
[
'
ALLPV_ZERR[pv_indx]
'
]
=
ALLPV_POSERR
(
pvs
,
2
)
#get long/down/up type particle variables
get_all_part_vars
(
evt_vars
,
long_particles
,
pvs
,
MCTRUTH_long_parts
,
index_name
=
'
long_indx
'
,
suffix
=
"
LONGPART
"
,
is_long
=
True
)
get_all_part_vars
(
evt_vars
,
down_particles
,
pvs
,
MCTRUTH_down_parts
,
index_name
=
'
down_indx
'
,
suffix
=
"
DOWNPART
"
)
get_all_part_vars
(
evt_vars
,
up_particles
,
pvs
,
MCTRUTH_up_parts
,
index_name
=
'
up_indx
'
,
suffix
=
"
UPPART
"
)
#get Bcand variables
evt_vars
[
'
ALLB_ID[bcand_indx]
'
]
=
ALLB_ID
(
Bcands
)
evt_vars
[
'
ALLB_KEY[bcand_indx]
'
]
=
ALLB_KEY
(
Bcands
)
evt_vars
[
'
ALLB_ENDVTX_CHI2[bcand_indx]
'
]
=
ALLB_ENDVTX_CHI2
(
Bcands
)
evt_vars
[
'
ALLB_ENDVTX_NDOF[bcand_indx]
'
]
=
ALLB_ENDVTX_NDOF
(
Bcands
)
evt_vars
[
'
ALLB_ENDVTX_X[bcand_indx]
'
]
=
ALLB_ENDVTX_X
(
Bcands
)
evt_vars
[
'
ALLB_ENDVTX_Y[bcand_indx]
'
]
=
ALLB_ENDVTX_Y
(
Bcands
)
evt_vars
[
'
ALLB_ENDVTX_Z[bcand_indx]
'
]
=
ALLB_ENDVTX_Z
(
Bcands
)
evt_vars
[
'
ALLB_ENDVTX_XERR[bcand_indx]
'
]
=
ALLB_ENDVTX_POSERR
(
Bcands
,
0
)
evt_vars
[
'
ALLB_ENDVTX_YERR[bcand_indx]
'
]
=
ALLB_ENDVTX_POSERR
(
Bcands
,
1
)
evt_vars
[
'
ALLB_ENDVTX_ZERR[bcand_indx]
'
]
=
ALLB_ENDVTX_POSERR
(
Bcands
,
2
)
evt_vars
[
'
ALLB_PX[bcand_indx]
'
]
=
ALLB_PX
(
Bcands
)
evt_vars
[
'
ALLB_PY[bcand_indx]
'
]
=
ALLB_PY
(
Bcands
)
evt_vars
[
'
ALLB_PZ[bcand_indx]
'
]
=
ALLB_PZ
(
Bcands
)
evt_vars
[
'
ALLB_PXERR[bcand_indx]
'
]
=
ALLB_MOMERR
(
Bcands
,
0
)
evt_vars
[
'
ALLB_PYERR[bcand_indx]
'
]
=
ALLB_MOMERR
(
Bcands
,
1
)
evt_vars
[
'
ALLB_PZERR[bcand_indx]
'
]
=
ALLB_MOMERR
(
Bcands
,
2
)
evt_vars
[
'
ALLB_ENERGY[bcand_indx]
'
]
=
ALLB_ENERGY
(
Bcands
)
evt_vars
[
'
ALLB_MASS[bcand_indx]
'
]
=
ALLB_MASS
(
Bcands
)
evt_vars
[
'
ALLB_ETA[bcand_indx]
'
]
=
ALLB_ETA
(
Bcands
)
evt_vars
[
'
ALLB_PHI[bcand_indx]
'
]
=
ALLB_PHI
(
Bcands
)
#P -> MCP
evt_vars
[
'
ALLB_TRUE_ID[bcand_indx]
'
]
=
ALLB_TRUE_ID
(
Bcands
,
MCTRUTH_Bs
)
evt_vars
[
'
ALLB_TRUE_KEY[bcand_indx]
'
]
=
ALLB_TRUE_KEY
(
Bcands
,
MCTRUTH_Bs
)
evt_vars
[
'
ALLB_TRUE_PV_X[bcand_indx]
'
]
=
ALLB_TRUE_PV_X
(
Bcands
,
MCTRUTH_Bs
)
evt_vars
[
'
ALLB_TRUE_PV_Y[bcand_indx]
'
]
=
ALLB_TRUE_PV_Y
(
Bcands
,
MCTRUTH_Bs
)
evt_vars
[
'
ALLB_TRUE_PV_Z[bcand_indx]
'
]
=
ALLB_TRUE_PV_Z
(
Bcands
,
MCTRUTH_Bs
)
##evt_vars['ALLB_TRUE_B0[bcand_indx]'] = ALLB_TRUE_ID(Bcands, MCTRUTH_Bs)
##evt_vars['ALLB_TRUE_DST[bcand_indx]'] = ALLB_TRUE_CHILD1_ID(Bcands, MCTRUTH_Bs) #D*-
##evt_vars['ALLB_TRUE_MU[bcand_indx]'] = ALLB_TRUE_CHILD2_ID(Bcands, MCTRUTH_Bs) #mu
##evt_vars['ALLB_TRUE_D0[bcand_indx]'] = ALLB_TRUE_CHILD11_ID(Bcands, MCTRUTH_Bs) #D0
##evt_vars['ALLB_TRUE_PI1[bcand_indx]'] = ALLB_TRUE_CHILD12_ID(Bcands, MCTRUTH_Bs) #pi
##evt_vars['ALLB_TRUE_K[bcand_indx]'] = ALLB_TRUE_CHILD111_ID(Bcands, MCTRUTH_Bs) #K
##evt_vars['ALLB_TRUE_PI2[bcand_indx]'] = ALLB_TRUE_CHILD112_ID(Bcands, MCTRUTH_Bs) #pi
##all basic particles of Bcands
get_all_part_vars
(
evt_vars
,
all_basics
,
pvs
,
MCTRUTH_Bs
,
index_name
=
'
basics_indx
'
,
suffix
=
"
BASICS
"
)
#get velo tracks variables
evt_vars
[
'
ALLVELOTRACKS_ETA[velo_trk_indx]
'
]
=
ALLVELOTRACKS_ETA
(
velo_tracks
)
evt_vars
[
'
ALLVELOTRACKS_PHI[velo_trk_indx]
'
]
=
ALLVELOTRACKS_PHI
(
velo_tracks
)
#FirstState
evt_vars
[
'
ALLVELOTRACKS_X[velo_trk_indx]
'
]
=
ALLVELOTRACKS_X
(
velo_tracks
)
evt_vars
[
'
ALLVELOTRACKS_Y[velo_trk_indx]
'
]
=
ALLVELOTRACKS_Y
(
velo_tracks
)
evt_vars
[
'
ALLVELOTRACKS_Z[velo_trk_indx]
'
]
=
ALLVELOTRACKS_Z
(
velo_tracks
)
evt_vars
[
'
ALLVELOTRACKS_TX[velo_trk_indx]
'
]
=
ALLVELOTRACKS_TX
(
velo_tracks
)
evt_vars
[
'
ALLVELOTRACKS_TY[velo_trk_indx]
'
]
=
ALLVELOTRACKS_TY
(
velo_tracks
)
#velo BPV information
evt_vars
[
'
ALLVELOTRACKS_BPV_KEY[velo_trk_indx]
'
]
=
ALLVELOTRACKS_BPV_KEY
(
velo_tracks
,
pvs
)
evt_vars
[
'
ALLVELOTRACKS_BPV_X[velo_trk_indx]
'
]
=
ALLVELOTRACKS_BPV_X
(
velo_tracks
,
pvs
)
evt_vars
[
'
ALLVELOTRACKS_BPV_Y[velo_trk_indx]
'
]
=
ALLVELOTRACKS_BPV_Y
(
velo_tracks
,
pvs
)
evt_vars
[
'
ALLVELOTRACKS_BPV_Z[velo_trk_indx]
'
]
=
ALLVELOTRACKS_BPV_Z
(
velo_tracks
,
pvs
)
evt_vars
[
'
ALLVELOTRACKS_BPV_IP[velo_trk_indx]
'
]
=
ALLVELOTRACKS_BPV_IP
(
velo_tracks
,
pvs
)
evt_vars
[
'
ALLVELOTRACKS_BPV_IPCHI2[velo_trk_indx]
'
]
=
ALLVELOTRACKS_BPV_IPCHI2
(
velo_tracks
,
pvs
)
#throws error about pointer
#evt_vars['ALLVELOTRACKS_FIRSTMEAS_X[velo_trk_indx]'] = ALLVELOTRACKS_FIRSTMEAS_X(velo_tracks)
#evt_vars['ALLVELOTRACKS_FIRSTMEAS_Y[velo_trk_indx]'] = ALLVELOTRACKS_FIRSTMEAS_Y(velo_tracks)
#evt_vars['ALLVELOTRACKS_FIRSTMEAS_Z[velo_trk_indx]'] = ALLVELOTRACKS_FIRSTMEAS_Z(velo_tracks)
#evt_vars['ALLVELOTRACKS_FIRSTMEAS_XERR[velo_trk_indx]'] = ALLVELOTRACKS_POSERR(velo_tracks, 0)
#evt_vars['ALLVELOTRACKS_FIRSTMEAS_YERR[velo_trk_indx]'] = ALLVELOTRACKS_POSERR(velo_tracks, 1)
#evt_vars['ALLVELOTRACKS_FIRSTMEAS_ZERR[velo_trk_indx]'] = ALLVELOTRACKS_POSERR(velo_tracks, 2)
#evt_vars['ALLVELOTRACKS_ENDVELO_X[velo_trk_indx]'] = ALLVELOTRACKS_ENDVELO_X(velo_tracks)
#evt_vars['ALLVELOTRACKS_ENDVELO_Y[velo_trk_indx]'] = ALLVELOTRACKS_ENDVELO_Y(velo_tracks)
#evt_vars['ALLVELOTRACKS_ENDVELO_Z[velo_trk_indx]'] = ALLVELOTRACKS_ENDVELO_Z(velo_tracks)
#evt_vars['ALLVELOTRACKS_ENDVELO_XERR[velo_trk_indx]'] = ALLVELOTRACKS_ENDVELO_POSERR(velo_tracks, 0)
#evt_vars['ALLVELOTRACKS_ENDVELO_YERR[velo_trk_indx]'] = ALLVELOTRACKS_ENDVELO_POSERR(velo_tracks, 1)
#evt_vars['ALLVELOTRACKS_ENDVELO_ZERR[velo_trk_indx]'] = ALLVELOTRACKS_ENDVELO_POSERR(velo_tracks, 2)
# define tupling algorithm
tuple_file
=
FunTuple_Event
(
name
=
"
Tuple
"
,
tuple_name
=
"
EventInfo
"
,
variables
=
evt_vars
)
#define algorithms
user_algorithms
=
{}
user_algorithms
[
'
Alg
'
]
=
[
my_filter
,
truth_filter_event
,
tuple_file
]
return
user_algorithms
\ No newline at end of file
Loading