From 2b1db43cc5b7bea76f6fe5781fdecfad04a82102 Mon Sep 17 00:00:00 2001 From: mferrill Date: Wed, 15 Sep 2021 14:25:51 +0200 Subject: [PATCH 01/82] First test with counters --- .env | 333 +++++++++++++++++++++++++++++++++ .vscode/c_cpp_properties.json | 19 ++ .vscode/settings.json | 221 ++++++++++++++++++++++ Phys/FunTuple/src/FunTuple.cpp | 18 +- 4 files changed, 588 insertions(+), 3 deletions(-) create mode 100644 .env create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json diff --git a/.env b/.env new file mode 100644 index 00000000..7194bd45 --- /dev/null +++ b/.env @@ -0,0 +1,333 @@ +COMMONPARTICLESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/CommonParticles +MUONMATCHROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonMatch +CALOFUTUREMONIDSTOPTS=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/options +PARTPROPROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp +HLTINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/HltInterfaces +FSRALGSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/FSRAlgs +MUONDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/MuonDet +CALOFUTUREDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureDAQ +MUONTRACKALIGNROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackAlign +RICHKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichKernel +LHCBMATHROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath +CALOFUTUREUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils +FIELDMAPROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/FieldMap/v5r7 +DECAYTREETUPLEHERSCHELROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleHerschel +KALMANFILTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/KalmanFilter +SELALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelAlgorithms +CALOFUTUREMONIDSTROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst +MAGNETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/Magnet +CALOUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloUtils +CALOFUTURERECOROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureReco +UTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/UT/UTDAQ +HCDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/HC/HCDAQ +HOSTNAME=grid-ui.physik.uzh.ch +CALODETXMLCNVROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/CaloDetXmlCnv +CCACHE_NOHASHDIR=1 +CCACHE_DEPEND=1 +DAVINCIFILTERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciFilters +SELTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelTools +RICHFUTUREALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichFutureAlgorithms +MUONDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Muon/MuonDAQ +FTDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/FTDet +ROOT_INCLUDE_PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cppgsl/3.1.0-7a1b6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jsonmcpp/3.9.1-72770/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include/eigen3:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Vc/1.4.1p1-71105/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include/python3.8:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/AIDA/3.2.1-3fe9f/x86_64-centos7-gcc10-opt/src/cpp:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rangev3/0.11.0-79ab4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/collier/1.2.4-bf1b5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/veccore/0.6.0-43a04/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/spdlog/1.5.0-d6cb3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gtest/1.10.0-b11fe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0/x86_64-pc-linux-gnu +PARTICLEMAKERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ParticleMaker +LOKIARRAYFUNCTORSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiArrayFunctors +BBDECTREETOOLROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/BBDecTreeTool +LUMIALGSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs +MUONKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Muon/MuonKernel +DETDESCEXAMPLEROOT=/disk/users/mferrill/lhcbstack/LHCb/Ex/DetDescExample +ASSOCIATORSBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsBase +TERM=xterm-256color +CCACHE_SLOPPINESS=locale,system_headers +DAVINCITRACKREFITTINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting +LOKIPHYSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiPhys +LOKIJETSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiJets +LOKIROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKi +TRACKEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/TrackEvent +LINKERINSTANCESROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances +LINKEREVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerEvent +MAKEFLAGS=ARGS=-j\ 4 +LBENV_CURRENT_WORKSPACE=/disk/users/mferrill/lhcbstack +PRCONFIGROOT=/disk/users/mferrill/lhcbstack/DBASE/PRConfig/v999r999 +DECAYTREETUPLEJETSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleJets +PRKALMANFILTERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PrKalmanFilter +RICHFUTURERECTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecTools +MUONTRACKRECROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackRec +UTASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTAssociators +RICHALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichAlgorithms +HLTEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/HltEvent +TMPDIR=/run/user/21343 +JETACCESSORIESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/JetAccessories +GAUDICONFUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils +OPENBLAS_NUM_THREADS=1 +JETTAGGINGROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/JetTagging +PATFITPARAMSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatFitParams +XMLSUMMARYBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase +RECEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/RecEvent +CCACHE_LOGFILE=/disk/users/mferrill/lhcbstack/.output/ccache.log +UTCHECKERSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTCheckers +RICHMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichMCTools +LOKINUMBERSROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiNumbers +ANALYSISPYTHONROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython +RICHFUTURETOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichFutureTools +GAUDI_QMTEST_CLASS=LHCbTest +DAVINCITOOLSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTools +ASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Associators/Associators +X509_CERT_DIR=/cvmfs/lhcb.cern.ch/etc/grid-security/certificates +LHCBRELEASES=/cvmfs/lhcb.cern.ch/lib/lhcb +DAVINCINEUTRALTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciNeutralTools +MICRODSTTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTTools +TRACKASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackAssociators +MUONTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTools +TRACKKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackKernel +GAUDIGSLROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiGSL +CALOFUTUREINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureInterfaces +LBENV_ALIASES=/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/lib/python3.8/site-packages/LbEnv/data/aliases.sh +PARTICLE2MCTRUTHROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth +LOKITRACKSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiTracks +LOKITRACK_V2ROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack_v2 +MDFROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/MDF +STAGE_HOST=castorlhcb.cern.ch +LC_ALL=C +DECAYTREETUPLEANNPIDROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleANNPID +GLOBALRECOROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalReco +CALOASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Calo/CaloAssociators +LHCBKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbKernel +FTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/FT/FTDAQ +PHYSEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/PhysEvent +PRCONVERTERSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrConverters +TRACKINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackInterfaces +VPKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/VP/VPKernel +MICRODSTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/MicroDst +DUMMYPRODUCERSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DummyProducers +DAQUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQUtils +USER=mferril +DECAYTREETUPLEMUONCALIBROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleMuonCalib +PHYSSELPYTHONROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/PhysSel/PhysSelPython +MICRODSTBASEROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTBase +RICHFUTUREMCUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureMCUtils +IOEXAMPLEROOT=/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample +DETDESCSVCROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescSvc +LD_LIBRARY_PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/AnalysisPython:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker:/cvmfs/lhcb.cern.ch/lib/lcg/releases/catboost/0.9.1.1-aaad8/x86_64-centos7-gcc10-opt/catboost/libs/model_interface:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libffi/3.2.1-26487/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/RELAX/root6-608a5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/lib64 +X509_VOMSES=/cvmfs/lhcb.cern.ch/etc/grid-security/vomses +CMTCONFIG=x86_64_v2-centos7-gcc10-opt +MICRODSTCONFROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTConf +RICHFUTURERECPIXELALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecPixelAlgorithms +FSREVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/FSREvent +EVENTSYSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventSys +CCACHE_DIR=/disk/users/mferrill/lhcbstack/.ccache/x86_64_v2-centos7-gcc10-opt +DECAYTREETUPLEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple +PARTICLECOMBINERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ParticleCombiners +DECAYTREEFITTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DecayTreeFitter +CALOKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel +TMVAWEIGHTSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PARAM/TMVAWeights/v1r17 +CHARGEDPROTOANNPIDPARAMROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PARAM/ChargedProtoANNPIDParam/v1r7 +SELPYROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/SelPy +PARTICLECONVERTERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ParticleConverters +PRVELOUTROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrVeloUT +SIMCOMPONENTSROOT=/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents +RICHUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichUtils +PHYSCONFROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/PhysConf +DAVINCITRANSPORTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciTransporter +MUONASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Muon/MuonAssociators +RICHFUTUREUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureUtils +CALODETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/CaloDet +DECFILESOPTS=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/Gen/DecFiles/v31r8/options +VERTEXFITROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/VertexFit +DAVINCIKERNELROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciKernel +PARAMETERIZEDKALMANROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/ParameterizedKalman +GITENTITYRESOLVERROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver +LHCBDOC=/eos/project/l/lhcbwebsites/www/projects +LCG_VERSION=100 +LBENV_SOURCED=2.1.2 +DECAYTREETUPLEMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleMC +LOKIPROTOPARTICLESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiProtoParticles +MUONTRACKMONITORROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor +TRACKUTILSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackUtils +VPALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPAlgorithms +MICRODSTINTERFACESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTInterfaces +GLOBALRECOMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools +MUONINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonInterfaces +MCASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/LHCb/Associators/MCAssociators +VIRTUAL_ENV_DISABLE_PROMPT=1 +RICHFUTURERECSYSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys +RICHINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichInterfaces +HLTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HltDAQ +DECAYTREETUPLEBASEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase +LUMINOSITYROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/Luminosity +RECREATEPIDTOOLSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/RecreatePIDTools +DETDESCCHECKSROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks +CALODAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ +MYSITEROOT=/cvmfs/lhcb.cern.ch/lib +LCG_RELEASES=/cvmfs/lhcb.cern.ch/lib/lcg/releases +LOKIFITTERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiFitters +FASTPVROOT=/disk/users/mferrill/lhcbstack/Rec/Tf/FastPV +TRACKSYSROOT=/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys +LHCBTRACKINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Tr/LHCbTrackInterfaces +ZEROMQROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/ZeroMQ +MCINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/MCInterfaces +GAUDI_QMTEST_MODULE=GaudiConf.QMTest.LHCbTest +SITOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Si/SiTools +PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qgraf/3.1.4-23be6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/FORM/4.1-8059a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/texinfo/6.3-21d20/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/swig/4.0.2-3be64/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pprof/54271f7-7afca/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkg_config/0.29.2-c6baf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/m4/1.4.18-89870/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperf/3.1-699d7/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_runewidth/703b5e6-ec180/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_readline/2972be2-02db8/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_liner/6f820f8-5ab05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_demangle/5e5cf60-84b17/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go/1.12.5-ff8e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/doxygen/1.8.18-79376/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/bison/3.3.2-929f9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/automake/1.16.1-aa1ac/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/autoconf/2.69-01523/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin:/disk/users/mferrill/lhcbstack/contrib/bin:/cvmfs/lhcb.cern.ch/lib/bin/x86_64-centos7:/cvmfs/lhcb.cern.ch/lib/bin/Linux-x86_64:/cvmfs/lhcb.cern.ch/lib/bin:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/bin:/usr/bin +FTEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/FTEvent +DAQEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DAQEvent +UTDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/UTDet +LHCBNIGHTLIES=/cvmfs/lhcbdev.cern.ch/nightlies +LC_MESSAGES=C +SELKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelKernel +CALOFUTUREPIDSROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFuturePIDs +CALOTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Calo/CaloTools +HLTSERVICESROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HltServices +DETDESCROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDesc +FUNCTORCACHEROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCache +PRKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrKernel +UTALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTAlgorithms +LOKIHLTROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiHlt +PWD=/disk/users/mferrill/lhcbstack +RECINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecInterfaces +PRPIXELROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrPixel +MUONIDROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonID +UTMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTMonitors +SIDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Si/SiDAQ +MDF_ROOTROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/MDF_ROOT +RAWEVENTFORMATROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9 +PARTICLEMAKERCHECKERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/ParticleMakerChecker +DAVINCITYPESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciTypes +RICHMCMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichMCMonitors +MICRODSTALGORITHMROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTAlgorithm +RICHFUTURERECBASEROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecBase +LOKITRACKROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack +RAWEVENTCOMPATROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat +LANG=C +SELREPORTSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/SelReports +TRACKCHECKERSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackCheckers +KERASROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/keras +TRACKTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackTools +TRACKMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMCTools +FILESTAGERROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager +GENEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/GenEvent +X509_VOMS_DIR=/etc/grid-security/vomsdir +LBENV_PREFIX=/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64 +COMPILER_PREFIX=/disk/users/mferrill/lhcbstack/utils/../contrib/bin/ccache +DSTWRITERSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters +MVADICTTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/MVADictTools +FTMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/FT/FTMonitors +DAQMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/DAQ/DAQMonitors +PYCONFROOT=/disk/users/mferrill/lhcbstack/LHCb/PyConf +DETCONDROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond +CALOINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloInterfaces +CMAKE_MAKE_PROGRAM=/disk/users/mferrill/lhcbstack/contrib/bin/ninja +DAVINCITRACKSCALINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling +DAVINCIINTERFACESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciInterfaces +PRALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrAlgorithms +RICHFUTUREKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureKernel +PHYSINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/PhysInterfaces +DECFILESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/Gen/DecFiles/v31r8 +MUONPIDCHECKERROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonPIDChecker +UTTELL1EVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/UT/UTTELL1Event +VPDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/VPDet +BCMDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/BcmDet +HLTTCKROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/TCK/HltTCK/v3r19p28 +DAVINCIDECAYFINDERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciDecayFinder +PROTOPARTICLEFILTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ProtoParticleFilter +GAUDICONFROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiConf +CCACHE_BASEDIR=/disk/users/mferrill/lhcbstack/Analysis +TISTOSTOBBINGROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/TisTosTobbing +EXTRAINFOTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ExtraInfoTools +PRMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrMCTools +ENV_CMAKE_SOURCE_DIR=/disk/users/mferrill/lhcbstack/Analysis +HIGHPTJETSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/HighPtJets +MCEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/MCEvent +RICHPIDQCROOT=/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC +LCG_hostos=x86_64-centos7 +HOME=/home/hep/mferril +SHLVL=1 +LOKIALGOMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC +RELATEDINFOTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/RelatedInfoTools +LOKIALGOROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiAlgo +LOKICOREROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore +XMLSUMMARYKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel +ALLOCATIONTRACKERROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/AllocationTracker +RICHFUTURERECINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecInterfaces +RECALGSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecAlgs +XMLTOOLSROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/XmlTools +LOCAL_POOL_DEPTH=24 +DECAYTREETUPLERECOROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleReco +DAVINCIMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciMCTools +DAVINCIOVERLAPSANDCLONESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciOverlapsAndClones +RICHFUTUREGLOBALPIDROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureGlobalPID +RICHFUTURERECALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecAlgorithms +NINJA_STATUS=[%u>%r>%f/%t] +RICHFUTURERECMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecMonitors +RICHFUTURERECTRACKALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecTrackAlgorithms +CHARGEDPROTOANNPIDROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/ChargedProtoANNPID +LHCBALGSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs +EVENTPACKERROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventPacker +DDDBROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB +LOKIPHYSMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC +DAVINCIMCKERNELROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciMCKernel +VPASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPAssociators +RICHDETECTORSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichDetectors +LOKIMCROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC +DIGIEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DigiEvent +DETDESCCNVROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescCnv +ENV_CMAKE_BUILD_TYPE=Release +PYTHONPATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zipp/0.5.1-80542/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wrapt/1.11.1-f9767/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/werkzeug/0.15.4-0963b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wcwidth/0.1.7-d9bfe/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/urllib3/1.25.3-011e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/traitlets/4.3.2-79480/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tornado/5.1.1-c3207/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/termcolor/1.1.0-53dbb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sortedcontainers/2.1.0-f643e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/six/1.12.0-f083a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/simplegeneric/0.8.1-6c6c6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools_scm/3.3.3-e036f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scandir/1.10.0-f348f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/retrying/1.3.3-688da/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests_oauthlib/1.2.0-aaad4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests/2.22.0-11042/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytz/2019.1-08128/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/python_dateutil/2.8.0-9ff92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest_runner/5.1-19882/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyparsing/2.4.0-6a86f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot_ng/2.0.0-d8af2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot/1.4.1-d8114/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycparser/2.19-6a30e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1_modules/0.2.5-07fd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1/0.4.5-a72f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/py/1.9.0-e4ba6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ptyprocess/0.6.0-e6e90/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pluggy/0.13.1-86414/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/plotly/4.5.0-28a4e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkgconfig/1.5.1-5c0e3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pillow/6.2.2-5bfe8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pickleshare/0.7.5-a69d8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pexpect/4.7.0-2ac74/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathlib2/2.3.3-12564/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/parso/0.4.0-c5561/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/packaging/19.0-11c14/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oauthlib/3.0.1-d2f8b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/multiprocess/0.70.10-c12ef/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mpmath/1.1.0-937c2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mock/3.0.5-79169/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/messaging/1.1-58db2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MarkupSafe/1.0-5c35d/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lxml/4.6.2-fd87e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/kiwisolver/1.0.1-e6ad1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_applications/1.0.8-d29c8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras/2.2.4-07b79/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Jinja2/2.11.2-d6c2f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jedi/0.13.3-8fbb8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython_genutils/0.2.0-94aa5/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/iniconfig/1.1.1-50696/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/importlib_metadata/2.0.0-30aeb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/idna/2.8-6e42a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz_py/0.11.1-f449f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth/1.6.3-0a1e8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/funcsigs/1.0.2-94a5e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/decorator/4.3.2-e21fb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cycler/0.10.0-94dd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/click/7.0-a8864/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cffi/1.12.2-7f42b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/certifi/2019.3.9-dde3e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cachetools/3.1.1-3bdaf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backports/1.0.0-17ff0/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backcall/0.1.0-032cd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/attrs/19.3.0-6eb83/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/atomicwrites/1.3.0-38de1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astunparse/1.6.3-c0056/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astor/0.8.1-cb8d6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/asn1crypto/0.24.0-40338/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/absl_py/0.11.0-489c4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pandas/1.2.2-5fc1a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow_estimator/2.3.0-4915e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/grpcio/1.28.1-d97df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/opt_einsum/3.2.0-3d6fc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/more_itertools/7.0.0-1f3ed/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/toml/0.10.2-d1026/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scipy/1.5.1-562d3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyyaml/5.3.1-18c69/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cryptography/3.3.2-00716/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_preprocessing/1.1.2-8cb53/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hypothesis/5.3.0-bcc92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/h5py/2.10.0-c6f13/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gast/0.3.3-6accc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages +PARAMFILESROOT=/disk/users/mferrill/lhcbstack/PARAM/ParamFiles/v999r999 +RECCONFROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecConf +PATCHECKERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatChecker +TRACKMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors +VPDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/VP/VPDAQ +LHCBDEV=/afs/cern.ch/lhcb/software/DEV +GENERICVERTEXFINDERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/GenericVertexFinder +LUMIEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LumiEvent +LBDD4HEPROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/LbDD4hep +STDOPTS=/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/options +CCACHE_TEMPDIR=/run/user/21343/ccache +LC_CTYPE=C +VPCHECKERSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPCheckers +EMACSDIR=/cvmfs/lhcb.cern.ch/lib/lhcb/TOOLS/Tools/Emacs/pro +FUNTUPLEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple +DECAYTREETUPLETRACKINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleTracking +RICHRECUTILSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichRecUtils +GAUDITENSORFLOWROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/GaudiTensorFlow +RELATIONSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations +HLTSCHEDULERROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HLTScheduler +DECAYTREETUPLETRIGGERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleTrigger +LWTNNPARSERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/lwtnnParser +FLAVOURTAGGINGROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/FlavourTagging +FUNCTORCOREROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore +UTTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTTools +LBCOMSYSROOT=/disk/users/mferrill/lhcbstack/Lbcom/LbcomSys +PRVPRETINAROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrVPRetina +TRACKEXTRAPOLATORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackExtrapolators +RICHDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/RichDet +DAQSYSROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys +TRACKFITEVENTROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitEvent +XDG_RUNTIME_DIR=/run/user/21343 +DISPLAY=localhost:10.0 +CMAKE_PREFIX_PATH=/disk/users/mferrill/lhcbstack:/cvmfs/lhcb.cern.ch/lib/lhcb:/cvmfs/lhcb.cern.ch/lib/lcg/releases:/cvmfs/lhcb.cern.ch/lib/lcg/app/releases:/cvmfs/lhcb.cern.ch/lib/lcg/external:/cvmfs/lhcb.cern.ch/lib/contrib:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/lib/python3.8/site-packages/LbDevTools/data/cmake:/cvmfs/sft.cern.ch/lcg/releases +BINARY_TAG=x86_64_v2-centos7-gcc10-opt +RICHFUTURERECCHECKERSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecCheckers +RICHFUTURERECPHOTONALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecPhotonAlgorithms +TRACKFITTERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitter +RICHTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichTools +OMP_THREAD_LIMIT=1 +ENV_CMAKE_BINARY_DIR=/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt +SCIFITRACKFORWARDINGROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/SciFiTrackForwarding +UTKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/UT/UTKernel +LCG_external_area=/cvmfs/lhcb.cern.ch/lib/lcg/external +DAVINCIASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciAssociators +PATPVROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatPV +RICHFUTURERECEVENTROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecEvent +PRFITPARAMSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrFitParams +EVENTASSOCROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventAssoc +DAQKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQKernel +DECAYTREETUPLEDALITZROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleDalitz +LOKIUTILSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiUtils +TRACKPROJECTORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackProjectors +DAVINCIPVTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciPVTools +RICHRECTESTSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichRecTests +CALOFUTURETOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureTools +RICHFUTUREDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureDAQ +EVENTBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventBase diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..2b6f2d6d --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,19 @@ +{ + "configurations": [ + { + "compileCommands": "/disk/users/mferrill/lhcbstack/.output/compile_commands-Analysis.json", + "compilerPath": "/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/bin/g++", + "includePath": [ + "../Analysis/**", + "../Phys/**", + "../Rec/**", + "../Lbcom/**", + "../LHCb/**", + "../Detector/**", + "../Gaudi/**" + ], + "name": "Linux" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..d68c0f30 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,221 @@ +{ + "python.analysis.extraPaths": [ + "/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/zipp/0.5.1-80542/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/wrapt/1.11.1-f9767/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/werkzeug/0.15.4-0963b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/wcwidth/0.1.7-d9bfe/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/urllib3/1.25.3-011e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/traitlets/4.3.2-79480/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tornado/5.1.1-c3207/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/termcolor/1.1.0-53dbb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/sortedcontainers/2.1.0-f643e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/six/1.12.0-f083a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/simplegeneric/0.8.1-6c6c6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools_scm/3.3.3-e036f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/scandir/1.10.0-f348f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/retrying/1.3.3-688da/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests_oauthlib/1.2.0-aaad4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests/2.22.0-11042/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytz/2019.1-08128/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/python_dateutil/2.8.0-9ff92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest_runner/5.1-19882/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyparsing/2.4.0-6a86f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot_ng/2.0.0-d8af2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot/1.4.1-d8114/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycparser/2.19-6a30e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1_modules/0.2.5-07fd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1/0.4.5-a72f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/py/1.9.0-e4ba6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ptyprocess/0.6.0-e6e90/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pluggy/0.13.1-86414/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/plotly/4.5.0-28a4e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkgconfig/1.5.1-5c0e3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pillow/6.2.2-5bfe8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pickleshare/0.7.5-a69d8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pexpect/4.7.0-2ac74/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathlib2/2.3.3-12564/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/parso/0.4.0-c5561/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/packaging/19.0-11c14/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/oauthlib/3.0.1-d2f8b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/multiprocess/0.70.10-c12ef/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/mpmath/1.1.0-937c2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/mock/3.0.5-79169/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/messaging/1.1-58db2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MarkupSafe/1.0-5c35d/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/lxml/4.6.2-fd87e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/kiwisolver/1.0.1-e6ad1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_applications/1.0.8-d29c8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras/2.2.4-07b79/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/Jinja2/2.11.2-d6c2f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/jedi/0.13.3-8fbb8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython_genutils/0.2.0-94aa5/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/iniconfig/1.1.1-50696/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/importlib_metadata/2.0.0-30aeb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/idna/2.8-6e42a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz_py/0.11.1-f449f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth/1.6.3-0a1e8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/funcsigs/1.0.2-94a5e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/decorator/4.3.2-e21fb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cycler/0.10.0-94dd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/click/7.0-a8864/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cffi/1.12.2-7f42b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/certifi/2019.3.9-dde3e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cachetools/3.1.1-3bdaf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/backports/1.0.0-17ff0/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/backcall/0.1.0-032cd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/attrs/19.3.0-6eb83/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/atomicwrites/1.3.0-38de1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/astunparse/1.6.3-c0056/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/astor/0.8.1-cb8d6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/asn1crypto/0.24.0-40338/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/absl_py/0.11.0-489c4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pandas/1.2.2-5fc1a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow_estimator/2.3.0-4915e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/grpcio/1.28.1-d97df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/opt_einsum/3.2.0-3d6fc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/more_itertools/7.0.0-1f3ed/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/toml/0.10.2-d1026/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/scipy/1.5.1-562d3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyyaml/5.3.1-18c69/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cryptography/3.3.2-00716/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_preprocessing/1.1.2-8cb53/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/hypothesis/5.3.0-bcc92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/h5py/2.10.0-c6f13/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/gast/0.3.3-6accc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", + "/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTConf/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/CommonParticles/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciPVTools/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/FlavourTagging/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/JetAccessories/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/JetTagging/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiAlgo/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiArrayFunctors/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiJets/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiPhys/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiProtoParticles/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiTracks/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiUtils/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/MVADictTools/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/PhysConf/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/SelPy/python/", + "/disk/users/mferrill/lhcbstack/Phys/PhysSel/PhysSelPython/python/", + "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/python/", + "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFuturePIDs/python/", + "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureReco/python/", + "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonID/python/", + "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonPIDChecker/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitter/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys/python/", + "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor/python/", + "/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack_v2/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/ChargedProtoANNPID/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalReco/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecMonitors/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tr/PatPV/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/RecConf/python/", + "/disk/users/mferrill/lhcbstack/Lbcom/Calo/CaloAssociators/python/", + "/disk/users/mferrill/lhcbstack/Lbcom/UT/UTTools/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsBase/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloUtils/python/", + "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureDAQ/python/", + "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils/python/", + "/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys/python/", + "/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Event/MicroDst/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample/python/", + "/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/python/", + "/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/FSRAlgs/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiHlt/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiNumbers/python/", + "/disk/users/mferrill/lhcbstack/LHCb/PyConf/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Rich/RichKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Tools/ZeroMQ/python/", + "/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCG_100/ROOT/v6.24.00/x86_64-centos7-gcc10-opt/lib", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPluginService/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPolicy/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiKernel/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiConfiguration/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/Gaudi/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiHive/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiMP/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiProfiling/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPython/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiSvc/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiExamples/python/" + ], + "python.envFile": "/disk/users/mferrill/lhcbstack/.output/runtime-Analysis.env" +} \ No newline at end of file diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 886f834b..c67d9f3c 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -170,6 +170,11 @@ private: Gaudi::Property> m_extraheaders_thor{ this, "thor_preamble", {}, "List of preamble/header to be included in ThOr Functors"}; + // Gaudi monitoring counters + mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr processed events"}; + mutable Gaudi::Accumulators::Counter<> m_nonempty_evt{this, "nr non-empty events"}; + mutable Gaudi::Accumulators::Counter<> m_multiple_cand_evt{this, "nr of events with multiple candidates"}; + // make custom data Gaudi::Property m_makeCustomData{ this, "make_custom_data", false, @@ -229,7 +234,7 @@ StatusCode FunTupleBase::initialize() { template <> StatusCode FunTupleBase::instantiate_thor() { - this->info() << "Instatiating ThOr functors!" << endmsg; + this->info() << "Instantiating ThOr functors!" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_fun_thor.emplace_back(); @@ -250,7 +255,7 @@ StatusCode FunTupleBase::instantiate_thor() { template <> StatusCode FunTupleBase::instantiate_thor() { - this->info() << "Instatiating ThOr functors!" << endmsg; + this->info() << "Instantiating ThOr functors!" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_mcfun_thor.emplace_back(); @@ -275,7 +280,7 @@ template StatusCode FunTupleBase::instantiate_loki() { // Instantiate all the functors (unfortunately the FunctorProp objects created in the previous step could not hold // this information). - this->info() << "Instatiating LoKi functors!" << endmsg; + this->info() << "Instantiating LoKi functors!" << endmsg; m_preamble_loki = boost::algorithm::join( m_preamble_def_loki.value(), "\n" ); for ( const auto& ptp : m_particletupleprops ) { std::vector imfunc_mc; @@ -469,6 +474,7 @@ void FunTupleBase::operator()( const T& particles ) const { // make ntuple // this->info() << "Making Tuple!" << endmsg; Tuples::Tuple ntuple = this->nTuple( m_ntupleTname ); + ++m_processed_evt; // loop over ParticleTupleProp (i.e. individual decay descriptors to get the particles) // this->info() << "Filling Tuple!" << endmsg; @@ -539,9 +545,12 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c if ( output.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; + }else{ + ++m_nonempty_evt; } if ( output.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + ++m_multiple_cand_evt; } // loop over FunctorProp to get individual functor outputs @@ -634,10 +643,13 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con if ( output.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; + }else { + ++m_nonempty_evt; } if ( output.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + ++m_multiple_cand_evt; } // loop over FunctorProp to get individual functor outputs -- GitLab From 2aed06b7d38bbcd09b2d7b55388297d7ace5ff26 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 28 Sep 2021 17:26:38 +0200 Subject: [PATCH 02/82] Add monitoring counters and Tupling of vector quantities --- .env | 109 ++++++++++----------- .vscode/settings.json | 173 ++++++++++++++++----------------- Phys/FunTuple/src/FunTuple.cpp | 80 +++++++++------ 3 files changed, 190 insertions(+), 172 deletions(-) diff --git a/.env b/.env index 7194bd45..c8958c7b 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -COMMONPARTICLESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/CommonParticles +COMMONPARTICLESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/CommonParticles MUONMATCHROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonMatch CALOFUTUREMONIDSTOPTS=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/options PARTPROPROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp @@ -12,7 +12,7 @@ LHCBMATHROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath CALOFUTUREUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils FIELDMAPROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/FieldMap/v5r7 DECAYTREETUPLEHERSCHELROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleHerschel -KALMANFILTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/KalmanFilter +KALMANFILTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/KalmanFilter SELALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelAlgorithms CALOFUTUREMONIDSTROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst MAGNETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/Magnet @@ -24,15 +24,15 @@ HOSTNAME=grid-ui.physik.uzh.ch CALODETXMLCNVROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/CaloDetXmlCnv CCACHE_NOHASHDIR=1 CCACHE_DEPEND=1 -DAVINCIFILTERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciFilters +DAVINCIFILTERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciFilters SELTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelTools RICHFUTUREALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichFutureAlgorithms MUONDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Muon/MuonDAQ FTDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/FTDet -ROOT_INCLUDE_PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cppgsl/3.1.0-7a1b6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jsonmcpp/3.9.1-72770/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include/eigen3:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Vc/1.4.1p1-71105/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include/python3.8:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/AIDA/3.2.1-3fe9f/x86_64-centos7-gcc10-opt/src/cpp:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rangev3/0.11.0-79ab4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/collier/1.2.4-bf1b5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/veccore/0.6.0-43a04/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/spdlog/1.5.0-d6cb3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gtest/1.10.0-b11fe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0/x86_64-pc-linux-gnu -PARTICLEMAKERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ParticleMaker -LOKIARRAYFUNCTORSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiArrayFunctors -BBDECTREETOOLROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/BBDecTreeTool +ROOT_INCLUDE_PATH=/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/include:/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cppgsl/3.1.0-7a1b6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jsonmcpp/3.9.1-72770/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include/eigen3:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Vc/1.4.1p1-71105/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include/python3.8:/cvmfs/lhcb.cern.ch/lib/lcg/releases/AIDA/3.2.1-3fe9f/x86_64-centos7-gcc10-opt/src/cpp:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rangev3/0.11.0-79ab4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/collier/1.2.4-bf1b5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/veccore/0.6.0-43a04/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/spdlog/1.5.0-d6cb3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gtest/1.10.0-b11fe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0/x86_64-pc-linux-gnu +PARTICLEMAKERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ParticleMaker +LOKIARRAYFUNCTORSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiArrayFunctors +BBDECTREETOOLROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/BBDecTreeTool LUMIALGSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs MUONKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Muon/MuonKernel DETDESCEXAMPLEROOT=/disk/users/mferrill/lhcbstack/LHCb/Ex/DetDescExample @@ -40,13 +40,13 @@ ASSOCIATORSBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsB TERM=xterm-256color CCACHE_SLOPPINESS=locale,system_headers DAVINCITRACKREFITTINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting -LOKIPHYSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiPhys -LOKIJETSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiJets -LOKIROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKi +LOKIPHYSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiPhys +LOKIJETSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiJets +LOKIROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKi TRACKEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/TrackEvent LINKERINSTANCESROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances LINKEREVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerEvent -MAKEFLAGS=ARGS=-j\ 4 +MAKEFLAGS= LBENV_CURRENT_WORKSPACE=/disk/users/mferrill/lhcbstack PRCONFIGROOT=/disk/users/mferrill/lhcbstack/DBASE/PRConfig/v999r999 DECAYTREETUPLEJETSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleJets @@ -57,10 +57,10 @@ UTASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTAssociators RICHALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichAlgorithms HLTEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/HltEvent TMPDIR=/run/user/21343 -JETACCESSORIESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/JetAccessories +JETACCESSORIESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/JetAccessories GAUDICONFUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils OPENBLAS_NUM_THREADS=1 -JETTAGGINGROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/JetTagging +JETTAGGINGROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/JetTagging PATFITPARAMSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatFitParams XMLSUMMARYBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase RECEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/RecEvent @@ -75,8 +75,8 @@ DAVINCITOOLSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTools ASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Associators/Associators X509_CERT_DIR=/cvmfs/lhcb.cern.ch/etc/grid-security/certificates LHCBRELEASES=/cvmfs/lhcb.cern.ch/lib/lhcb -DAVINCINEUTRALTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciNeutralTools -MICRODSTTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTTools +DAVINCINEUTRALTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciNeutralTools +MICRODSTTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTTools TRACKASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackAssociators MUONTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTools TRACKKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackKernel @@ -84,8 +84,7 @@ GAUDIGSLROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiGSL CALOFUTUREINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureInterfaces LBENV_ALIASES=/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/lib/python3.8/site-packages/LbEnv/data/aliases.sh PARTICLE2MCTRUTHROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth -LOKITRACKSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiTracks -LOKITRACK_V2ROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack_v2 +LOKITRACKSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiTracks MDFROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/MDF STAGE_HOST=castorlhcb.cern.ch LC_ALL=C @@ -103,49 +102,49 @@ DUMMYPRODUCERSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DummyProducers DAQUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQUtils USER=mferril DECAYTREETUPLEMUONCALIBROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleMuonCalib -PHYSSELPYTHONROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/PhysSel/PhysSelPython -MICRODSTBASEROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTBase +PHYSSELPYTHONROOT=/disk/users/mferrill/lhcbstack/Phys/PhysSel/PhysSelPython +MICRODSTBASEROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTBase RICHFUTUREMCUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureMCUtils IOEXAMPLEROOT=/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample DETDESCSVCROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescSvc -LD_LIBRARY_PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/AnalysisPython:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker:/cvmfs/lhcb.cern.ch/lib/lcg/releases/catboost/0.9.1.1-aaad8/x86_64-centos7-gcc10-opt/catboost/libs/model_interface:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libffi/3.2.1-26487/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/RELAX/root6-608a5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/lib64 +LD_LIBRARY_PATH=/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/AnalysisPython:/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/catboost/0.9.1.1-aaad8/x86_64-centos7-gcc10-opt/catboost/libs/model_interface:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libffi/3.2.1-26487/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/RELAX/root6-608a5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/lib64 X509_VOMSES=/cvmfs/lhcb.cern.ch/etc/grid-security/vomses CMTCONFIG=x86_64_v2-centos7-gcc10-opt -MICRODSTCONFROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTConf +MICRODSTCONFROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTConf RICHFUTURERECPIXELALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecPixelAlgorithms FSREVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/FSREvent EVENTSYSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventSys CCACHE_DIR=/disk/users/mferrill/lhcbstack/.ccache/x86_64_v2-centos7-gcc10-opt DECAYTREETUPLEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple -PARTICLECOMBINERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ParticleCombiners -DECAYTREEFITTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DecayTreeFitter +PARTICLECOMBINERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ParticleCombiners +DECAYTREEFITTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DecayTreeFitter CALOKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel TMVAWEIGHTSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PARAM/TMVAWeights/v1r17 CHARGEDPROTOANNPIDPARAMROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PARAM/ChargedProtoANNPIDParam/v1r7 -SELPYROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/SelPy -PARTICLECONVERTERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ParticleConverters +SELPYROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/SelPy +PARTICLECONVERTERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ParticleConverters PRVELOUTROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrVeloUT SIMCOMPONENTSROOT=/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents RICHUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichUtils -PHYSCONFROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/PhysConf -DAVINCITRANSPORTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciTransporter +PHYSCONFROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/PhysConf +DAVINCITRANSPORTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciTransporter MUONASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Muon/MuonAssociators RICHFUTUREUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureUtils CALODETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/CaloDet DECFILESOPTS=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/Gen/DecFiles/v31r8/options -VERTEXFITROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/VertexFit -DAVINCIKERNELROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciKernel +VERTEXFITROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/VertexFit +DAVINCIKERNELROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciKernel PARAMETERIZEDKALMANROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/ParameterizedKalman GITENTITYRESOLVERROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver LHCBDOC=/eos/project/l/lhcbwebsites/www/projects LCG_VERSION=100 LBENV_SOURCED=2.1.2 DECAYTREETUPLEMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleMC -LOKIPROTOPARTICLESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiProtoParticles +LOKIPROTOPARTICLESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiProtoParticles MUONTRACKMONITORROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor TRACKUTILSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackUtils VPALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPAlgorithms -MICRODSTINTERFACESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTInterfaces +MICRODSTINTERFACESROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTInterfaces GLOBALRECOMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools MUONINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonInterfaces MCASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/LHCb/Associators/MCAssociators @@ -154,13 +153,13 @@ RICHFUTURERECSYSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys RICHINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichInterfaces HLTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HltDAQ DECAYTREETUPLEBASEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase -LUMINOSITYROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/Luminosity +LUMINOSITYROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/Luminosity RECREATEPIDTOOLSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/RecreatePIDTools DETDESCCHECKSROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks CALODAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ MYSITEROOT=/cvmfs/lhcb.cern.ch/lib LCG_RELEASES=/cvmfs/lhcb.cern.ch/lib/lcg/releases -LOKIFITTERSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiFitters +LOKIFITTERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiFitters FASTPVROOT=/disk/users/mferrill/lhcbstack/Rec/Tf/FastPV TRACKSYSROOT=/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys LHCBTRACKINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Tr/LHCbTrackInterfaces @@ -168,7 +167,7 @@ ZEROMQROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/ZeroMQ MCINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/MCInterfaces GAUDI_QMTEST_MODULE=GaudiConf.QMTest.LHCbTest SITOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Si/SiTools -PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qgraf/3.1.4-23be6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/FORM/4.1-8059a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/texinfo/6.3-21d20/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/swig/4.0.2-3be64/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pprof/54271f7-7afca/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkg_config/0.29.2-c6baf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/m4/1.4.18-89870/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperf/3.1-699d7/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_runewidth/703b5e6-ec180/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_readline/2972be2-02db8/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_liner/6f820f8-5ab05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_demangle/5e5cf60-84b17/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go/1.12.5-ff8e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/doxygen/1.8.18-79376/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/bison/3.3.2-929f9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/automake/1.16.1-aa1ac/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/autoconf/2.69-01523/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin:/disk/users/mferrill/lhcbstack/contrib/bin:/cvmfs/lhcb.cern.ch/lib/bin/x86_64-centos7:/cvmfs/lhcb.cern.ch/lib/bin/Linux-x86_64:/cvmfs/lhcb.cern.ch/lib/bin:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/bin:/usr/bin +PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qgraf/3.1.4-23be6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/FORM/4.1-8059a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/texinfo/6.3-21d20/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/swig/4.0.2-3be64/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pprof/54271f7-7afca/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkg_config/0.29.2-c6baf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/m4/1.4.18-89870/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperf/3.1-699d7/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_runewidth/703b5e6-ec180/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_readline/2972be2-02db8/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_liner/6f820f8-5ab05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_demangle/5e5cf60-84b17/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go/1.12.5-ff8e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/doxygen/1.8.18-79376/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/bison/3.3.2-929f9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/automake/1.16.1-aa1ac/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/autoconf/2.69-01523/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin:/disk/users/mferrill/lhcbstack/contrib/bin:/cvmfs/lhcb.cern.ch/lib/bin/x86_64-centos7:/cvmfs/lhcb.cern.ch/lib/bin/Linux-x86_64:/cvmfs/lhcb.cern.ch/lib/bin:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/bin:/usr/bin FTEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/FTEvent DAQEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DAQEvent UTDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/UTDet @@ -192,16 +191,16 @@ SIDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Si/SiDAQ MDF_ROOTROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/MDF_ROOT RAWEVENTFORMATROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9 PARTICLEMAKERCHECKERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/ParticleMakerChecker -DAVINCITYPESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciTypes +DAVINCITYPESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciTypes RICHMCMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichMCMonitors -MICRODSTALGORITHMROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/MicroDST/MicroDSTAlgorithm +MICRODSTALGORITHMROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTAlgorithm RICHFUTURERECBASEROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecBase LOKITRACKROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack RAWEVENTCOMPATROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat LANG=C -SELREPORTSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/SelReports +SELREPORTSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/SelReports TRACKCHECKERSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackCheckers -KERASROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/keras +KERASROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/keras TRACKTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackTools TRACKMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMCTools FILESTAGERROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager @@ -210,7 +209,7 @@ X509_VOMS_DIR=/etc/grid-security/vomsdir LBENV_PREFIX=/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64 COMPILER_PREFIX=/disk/users/mferrill/lhcbstack/utils/../contrib/bin/ccache DSTWRITERSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters -MVADICTTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/MVADictTools +MVADICTTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/MVADictTools FTMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/FT/FTMonitors DAQMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/DAQ/DAQMonitors PYCONFROOT=/disk/users/mferrill/lhcbstack/LHCb/PyConf @@ -218,7 +217,7 @@ DETCONDROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond CALOINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloInterfaces CMAKE_MAKE_PROGRAM=/disk/users/mferrill/lhcbstack/contrib/bin/ninja DAVINCITRACKSCALINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling -DAVINCIINTERFACESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciInterfaces +DAVINCIINTERFACESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciInterfaces PRALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrAlgorithms RICHFUTUREKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureKernel PHYSINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/PhysInterfaces @@ -229,22 +228,22 @@ VPDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/VPDet BCMDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/BcmDet HLTTCKROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/TCK/HltTCK/v3r19p28 DAVINCIDECAYFINDERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciDecayFinder -PROTOPARTICLEFILTERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ProtoParticleFilter +PROTOPARTICLEFILTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ProtoParticleFilter GAUDICONFROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiConf CCACHE_BASEDIR=/disk/users/mferrill/lhcbstack/Analysis -TISTOSTOBBINGROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/TisTosTobbing -EXTRAINFOTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/ExtraInfoTools +TISTOSTOBBINGROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/TisTosTobbing +EXTRAINFOTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ExtraInfoTools PRMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrMCTools ENV_CMAKE_SOURCE_DIR=/disk/users/mferrill/lhcbstack/Analysis -HIGHPTJETSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/HighPtJets +HIGHPTJETSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/HighPtJets MCEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/MCEvent RICHPIDQCROOT=/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC LCG_hostos=x86_64-centos7 HOME=/home/hep/mferril SHLVL=1 LOKIALGOMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC -RELATEDINFOTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/RelatedInfoTools -LOKIALGOROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiAlgo +RELATEDINFOTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/RelatedInfoTools +LOKIALGOROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiAlgo LOKICOREROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore XMLSUMMARYKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel ALLOCATIONTRACKERROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/AllocationTracker @@ -254,7 +253,7 @@ XMLTOOLSROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/XmlTools LOCAL_POOL_DEPTH=24 DECAYTREETUPLERECOROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleReco DAVINCIMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciMCTools -DAVINCIOVERLAPSANDCLONESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciOverlapsAndClones +DAVINCIOVERLAPSANDCLONESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciOverlapsAndClones RICHFUTUREGLOBALPIDROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureGlobalPID RICHFUTURERECALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecAlgorithms NINJA_STATUS=[%u>%r>%f/%t] @@ -265,21 +264,21 @@ LHCBALGSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs EVENTPACKERROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventPacker DDDBROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB LOKIPHYSMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC -DAVINCIMCKERNELROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciMCKernel +DAVINCIMCKERNELROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciMCKernel VPASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPAssociators RICHDETECTORSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichDetectors LOKIMCROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC DIGIEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DigiEvent DETDESCCNVROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescCnv ENV_CMAKE_BUILD_TYPE=Release -PYTHONPATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zipp/0.5.1-80542/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wrapt/1.11.1-f9767/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/werkzeug/0.15.4-0963b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wcwidth/0.1.7-d9bfe/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/urllib3/1.25.3-011e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/traitlets/4.3.2-79480/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tornado/5.1.1-c3207/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/termcolor/1.1.0-53dbb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sortedcontainers/2.1.0-f643e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/six/1.12.0-f083a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/simplegeneric/0.8.1-6c6c6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools_scm/3.3.3-e036f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scandir/1.10.0-f348f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/retrying/1.3.3-688da/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests_oauthlib/1.2.0-aaad4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests/2.22.0-11042/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytz/2019.1-08128/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/python_dateutil/2.8.0-9ff92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest_runner/5.1-19882/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyparsing/2.4.0-6a86f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot_ng/2.0.0-d8af2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot/1.4.1-d8114/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycparser/2.19-6a30e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1_modules/0.2.5-07fd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1/0.4.5-a72f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/py/1.9.0-e4ba6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ptyprocess/0.6.0-e6e90/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pluggy/0.13.1-86414/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/plotly/4.5.0-28a4e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkgconfig/1.5.1-5c0e3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pillow/6.2.2-5bfe8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pickleshare/0.7.5-a69d8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pexpect/4.7.0-2ac74/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathlib2/2.3.3-12564/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/parso/0.4.0-c5561/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/packaging/19.0-11c14/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oauthlib/3.0.1-d2f8b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/multiprocess/0.70.10-c12ef/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mpmath/1.1.0-937c2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mock/3.0.5-79169/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/messaging/1.1-58db2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MarkupSafe/1.0-5c35d/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lxml/4.6.2-fd87e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/kiwisolver/1.0.1-e6ad1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_applications/1.0.8-d29c8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras/2.2.4-07b79/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Jinja2/2.11.2-d6c2f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jedi/0.13.3-8fbb8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython_genutils/0.2.0-94aa5/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/iniconfig/1.1.1-50696/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/importlib_metadata/2.0.0-30aeb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/idna/2.8-6e42a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz_py/0.11.1-f449f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth/1.6.3-0a1e8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/funcsigs/1.0.2-94a5e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/decorator/4.3.2-e21fb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cycler/0.10.0-94dd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/click/7.0-a8864/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cffi/1.12.2-7f42b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/certifi/2019.3.9-dde3e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cachetools/3.1.1-3bdaf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backports/1.0.0-17ff0/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backcall/0.1.0-032cd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/attrs/19.3.0-6eb83/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/atomicwrites/1.3.0-38de1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astunparse/1.6.3-c0056/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astor/0.8.1-cb8d6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/asn1crypto/0.24.0-40338/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/absl_py/0.11.0-489c4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pandas/1.2.2-5fc1a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow_estimator/2.3.0-4915e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/grpcio/1.28.1-d97df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/opt_einsum/3.2.0-3d6fc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/more_itertools/7.0.0-1f3ed/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/toml/0.10.2-d1026/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scipy/1.5.1-562d3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyyaml/5.3.1-18c69/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cryptography/3.3.2-00716/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_preprocessing/1.1.2-8cb53/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hypothesis/5.3.0-bcc92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/h5py/2.10.0-c6f13/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gast/0.3.3-6accc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages +PYTHONPATH=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/:/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zipp/0.5.1-80542/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wrapt/1.11.1-f9767/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/werkzeug/0.15.4-0963b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wcwidth/0.1.7-d9bfe/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/urllib3/1.25.3-011e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/traitlets/4.3.2-79480/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tornado/5.1.1-c3207/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/termcolor/1.1.0-53dbb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sortedcontainers/2.1.0-f643e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/six/1.12.0-f083a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/simplegeneric/0.8.1-6c6c6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools_scm/3.3.3-e036f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scandir/1.10.0-f348f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/retrying/1.3.3-688da/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests_oauthlib/1.2.0-aaad4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests/2.22.0-11042/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytz/2019.1-08128/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/python_dateutil/2.8.0-9ff92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest_runner/5.1-19882/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyparsing/2.4.0-6a86f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot_ng/2.0.0-d8af2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot/1.4.1-d8114/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycparser/2.19-6a30e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1_modules/0.2.5-07fd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1/0.4.5-a72f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/py/1.9.0-e4ba6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ptyprocess/0.6.0-e6e90/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pluggy/0.13.1-86414/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/plotly/4.5.0-28a4e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkgconfig/1.5.1-5c0e3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pillow/6.2.2-5bfe8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pickleshare/0.7.5-a69d8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pexpect/4.7.0-2ac74/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathlib2/2.3.3-12564/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/parso/0.4.0-c5561/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/packaging/19.0-11c14/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oauthlib/3.0.1-d2f8b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/multiprocess/0.70.10-c12ef/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mpmath/1.1.0-937c2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mock/3.0.5-79169/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/messaging/1.1-58db2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MarkupSafe/1.0-5c35d/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lxml/4.6.2-fd87e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/kiwisolver/1.0.1-e6ad1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_applications/1.0.8-d29c8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras/2.2.4-07b79/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Jinja2/2.11.2-d6c2f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jedi/0.13.3-8fbb8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython_genutils/0.2.0-94aa5/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/iniconfig/1.1.1-50696/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/importlib_metadata/2.0.0-30aeb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/idna/2.8-6e42a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz_py/0.11.1-f449f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth/1.6.3-0a1e8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/funcsigs/1.0.2-94a5e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/decorator/4.3.2-e21fb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cycler/0.10.0-94dd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/click/7.0-a8864/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cffi/1.12.2-7f42b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/certifi/2019.3.9-dde3e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cachetools/3.1.1-3bdaf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backports/1.0.0-17ff0/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backcall/0.1.0-032cd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/attrs/19.3.0-6eb83/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/atomicwrites/1.3.0-38de1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astunparse/1.6.3-c0056/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astor/0.8.1-cb8d6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/asn1crypto/0.24.0-40338/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/absl_py/0.11.0-489c4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pandas/1.2.2-5fc1a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow_estimator/2.3.0-4915e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/grpcio/1.28.1-d97df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/opt_einsum/3.2.0-3d6fc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/more_itertools/7.0.0-1f3ed/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/toml/0.10.2-d1026/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scipy/1.5.1-562d3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyyaml/5.3.1-18c69/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cryptography/3.3.2-00716/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_preprocessing/1.1.2-8cb53/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hypothesis/5.3.0-bcc92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/h5py/2.10.0-c6f13/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gast/0.3.3-6accc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages PARAMFILESROOT=/disk/users/mferrill/lhcbstack/PARAM/ParamFiles/v999r999 RECCONFROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecConf PATCHECKERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatChecker TRACKMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors VPDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/VP/VPDAQ LHCBDEV=/afs/cern.ch/lhcb/software/DEV -GENERICVERTEXFINDERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/GenericVertexFinder +GENERICVERTEXFINDERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/GenericVertexFinder LUMIEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LumiEvent LBDD4HEPROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/LbDD4hep STDOPTS=/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/options @@ -294,8 +293,8 @@ GAUDITENSORFLOWROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/GaudiTensorFlow RELATIONSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations HLTSCHEDULERROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HLTScheduler DECAYTREETUPLETRIGGERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleTrigger -LWTNNPARSERROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/lwtnnParser -FLAVOURTAGGINGROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/FlavourTagging +LWTNNPARSERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/lwtnnParser +FLAVOURTAGGINGROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/FlavourTagging FUNCTORCOREROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore UTTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTTools LBCOMSYSROOT=/disk/users/mferrill/lhcbstack/Lbcom/LbcomSys @@ -305,7 +304,7 @@ RICHDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/RichDet DAQSYSROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys TRACKFITEVENTROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitEvent XDG_RUNTIME_DIR=/run/user/21343 -DISPLAY=localhost:10.0 +DISPLAY=localhost:13.0 CMAKE_PREFIX_PATH=/disk/users/mferrill/lhcbstack:/cvmfs/lhcb.cern.ch/lib/lhcb:/cvmfs/lhcb.cern.ch/lib/lcg/releases:/cvmfs/lhcb.cern.ch/lib/lcg/app/releases:/cvmfs/lhcb.cern.ch/lib/lcg/external:/cvmfs/lhcb.cern.ch/lib/contrib:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/lib/python3.8/site-packages/LbDevTools/data/cmake:/cvmfs/sft.cern.ch/lcg/releases BINARY_TAG=x86_64_v2-centos7-gcc10-opt RICHFUTURERECCHECKERSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecCheckers @@ -324,9 +323,9 @@ PRFITPARAMSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrFitParams EVENTASSOCROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventAssoc DAQKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQKernel DECAYTREETUPLEDALITZROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleDalitz -LOKIUTILSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/LoKiUtils +LOKIUTILSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiUtils TRACKPROJECTORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackProjectors -DAVINCIPVTOOLSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PHYS/PHYS_v33r0/Phys/DaVinciPVTools +DAVINCIPVTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciPVTools RICHRECTESTSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichRecTests CALOFUTURETOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureTools RICHFUTUREDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureDAQ diff --git a/.vscode/settings.json b/.vscode/settings.json index d68c0f30..2a7b7f16 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,15 +1,15 @@ { "python.analysis.extraPaths": [ "/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/", "/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/", + "/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/", "/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib", "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", @@ -131,91 +131,90 @@ "/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", "/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", "/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTConf/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/CommonParticles/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciPVTools/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/FlavourTagging/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/JetAccessories/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/JetTagging/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiAlgo/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiArrayFunctors/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiJets/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiPhys/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiProtoParticles/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiTracks/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiUtils/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/MVADictTools/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/PhysConf/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/SelPy/python/", "/disk/users/mferrill/lhcbstack/Phys/PhysSel/PhysSelPython/python/", - "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/python/", - "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFuturePIDs/python/", - "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureReco/python/", - "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonID/python/", - "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonPIDChecker/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitter/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys/python/", - "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor/python/", - "/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack_v2/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/ChargedProtoANNPID/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalReco/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecMonitors/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tr/PatPV/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/SelPy/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/PhysConf/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/MVADictTools/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiUtils/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiTracks/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiProtoParticles/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiPhys/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiJets/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiArrayFunctors/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiAlgo/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/JetTagging/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/JetAccessories/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/FlavourTagging/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciPVTools/python/", + "/disk/users/mferrill/lhcbstack/Phys/Phys/CommonParticles/python/", + "/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTConf/python/", "/disk/users/mferrill/lhcbstack/Rec/Rec/RecConf/python/", - "/disk/users/mferrill/lhcbstack/Lbcom/Calo/CaloAssociators/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tr/PatPV/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecMonitors/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalReco/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/ChargedProtoANNPID/python/", + "/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack/python/", + "/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore/python/", + "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors/python/", + "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitter/python/", + "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonPIDChecker/python/", + "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonID/python/", + "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureReco/python/", + "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFuturePIDs/python/", + "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/python/", "/disk/users/mferrill/lhcbstack/Lbcom/UT/UTTools/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsBase/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloUtils/python/", - "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureDAQ/python/", - "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils/python/", - "/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys/python/", - "/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Event/MicroDst/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample/python/", - "/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/python/", - "/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/FSRAlgs/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiHlt/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiNumbers/python/", - "/disk/users/mferrill/lhcbstack/LHCb/PyConf/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Rich/RichKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver/python/", + "/disk/users/mferrill/lhcbstack/Lbcom/Calo/CaloAssociators/python/", "/disk/users/mferrill/lhcbstack/LHCb/Tools/ZeroMQ/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Rich/RichKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/PyConf/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiNumbers/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiHlt/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Kernel/FSRAlgs/python/", + "/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils/python/", + "/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Event/MicroDst/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB/python/", + "/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat/python/", + "/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys/python/", + "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils/python/", + "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureDAQ/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloUtils/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ/python/", + "/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsBase/python/", "/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCG_100/ROOT/v6.24.00/x86_64-centos7-gcc10-opt/lib", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPluginService/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPolicy/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiKernel/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiConfiguration/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/Gaudi/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiHive/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiMP/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiProfiling/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPython/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiExamples/python/", "/disk/users/mferrill/lhcbstack/Gaudi/GaudiSvc/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiExamples/python/" + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPython/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiProfiling/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiMP/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiHive/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/Gaudi/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiConfiguration/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiKernel/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPolicy/python/", + "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPluginService/python/" ], "python.envFile": "/disk/users/mferrill/lhcbstack/.output/runtime-Analysis.env" } \ No newline at end of file diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index c67d9f3c..6c2e456f 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -17,6 +17,8 @@ #include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/Vector3DTypes.h" #include "GaudiKernel/Vector4DTypes.h" +#include "GaudiKernel/Point3DTypes.h" +#include "GaudiKernel/Point4DTypes.h" // Event #include "Event/MCParticle.h" @@ -171,9 +173,11 @@ private: this, "thor_preamble", {}, "List of preamble/header to be included in ThOr Functors"}; // Gaudi monitoring counters - mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr processed events"}; - mutable Gaudi::Accumulators::Counter<> m_nonempty_evt{this, "nr non-empty events"}; + mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr of processed events"}; + mutable Gaudi::Accumulators::Counter<> m_nonempty_evt{this, "nr of non-empty events"}; mutable Gaudi::Accumulators::Counter<> m_multiple_cand_evt{this, "nr of events with multiple candidates"}; + void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; + void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; // make custom data Gaudi::Property m_makeCustomData{ @@ -462,6 +466,12 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( double ) ) { return ntuple->column( colname, std::any_cast( val ) ); + } else if ( val.type() == typeid( Gaudi::LorentzVector ) ) { + return ntuple->column( colname, std::any_cast( val ) ); + } else if ( val.type() == typeid( Gaudi::XYZVector ) ) { + return ntuple->column( colname, std::any_cast( val ) ); + } else if ( val.type() == typeid( Gaudi::XYZPoint ) ) { + return ntuple->column( colname, std::any_cast( val ) ); } else { this->err() << "Type value returned by functor not recognised." << endmsg; } @@ -538,20 +548,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c // find the MC decay finder.findDecay( input.begin(), input.end(), output ); - - // TODO: Need to handle multiple cands. For now just throw an error - // log << "Found #" << output.size() << " decays" << endmsg; - // for (const auto& p: output){log << *p << endmsg;} - if ( output.empty() ) { - log << "No candidates found in this event. Skipping this event" << endmsg; - return; - }else{ - ++m_nonempty_evt; - } - if ( output.size() > 1 ) { - log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - ++m_multiple_cand_evt; - } + monitorOutputMCParticle( i, output ); // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { @@ -637,20 +634,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con // find the decay finder.findDecay( input.begin(), input.end(), output ); - // log << "Found #" << output.size() << " decays" << endmsg; - // for (const auto& p: output){log << *p << endmsg;} - - if ( output.empty() ) { - log << "No candidates found in this event. Skipping this event" << endmsg; - return; - }else { - ++m_nonempty_evt; - } - - if ( output.size() > 1 ) { - log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - ++m_multiple_cand_evt; - } + monitorOutputParticle( i, output ); // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { @@ -894,5 +878,41 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L p.setEndVertex( p_endvertx ); } +// Monitoring the size of the current event +template +void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { + // Messaging service + MsgStream log = this->info(); + + if ( p.empty() ) { + log << "No candidates found in this event. Skipping this event" << endmsg; + return; + }else if( (!p.empty()) && idx==0 ){ + ++m_nonempty_evt; + } + if ( p.size() > 1 ) { + log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + if ( idx==0 ) ++m_multiple_cand_evt; + } + return; +} +template +void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { + // Messaging service + MsgStream log = this->info(); + + if ( p.empty() ) { + log << "No candidates found in this event. Skipping this event" << endmsg; + return; + }else if( (!p.empty()) && idx==0 ){ + ++m_nonempty_evt; + } + if ( p.size() > 1 ) { + log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + if ( idx==0 ) ++m_multiple_cand_evt; + } + return; +} + DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_Particles" ) DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_MCParticles" ) -- GitLab From 72a2ce0ef319665eea6ba8e751c3849be5f6f0f2 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Tue, 28 Sep 2021 15:27:04 +0000 Subject: [PATCH 03/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/16562913 --- Phys/FunTuple/src/FunTuple.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 6c2e456f..4d40c53f 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -14,11 +14,10 @@ #include "GaudiAlg/GaudiTupleAlg.h" #include "GaudiKernel/MsgStream.h" #include "GaudiKernel/Point3DTypes.h" +#include "GaudiKernel/Point4DTypes.h" #include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/Vector3DTypes.h" #include "GaudiKernel/Vector4DTypes.h" -#include "GaudiKernel/Point3DTypes.h" -#include "GaudiKernel/Point4DTypes.h" // Event #include "Event/MCParticle.h" @@ -887,12 +886,12 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; - }else if( (!p.empty()) && idx==0 ){ + } else if ( ( !p.empty() ) && idx == 0 ) { ++m_nonempty_evt; } if ( p.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - if ( idx==0 ) ++m_multiple_cand_evt; + if ( idx == 0 ) ++m_multiple_cand_evt; } return; } @@ -904,12 +903,12 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; - }else if( (!p.empty()) && idx==0 ){ + } else if ( ( !p.empty() ) && idx == 0 ) { ++m_nonempty_evt; } if ( p.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - if ( idx==0 ) ++m_multiple_cand_evt; + if ( idx == 0 ) ++m_multiple_cand_evt; } return; } -- GitLab From 60a36420e75a08cc5d97774cbe7b8eafba32daa5 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 28 Sep 2021 17:46:10 +0200 Subject: [PATCH 04/82] cleanup and addressing issue #16 --- Phys/FunTuple/src/FunTuple.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 4d40c53f..5e794d23 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -913,5 +913,6 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH return; } -DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_Particles" ) +DECLARE_COMPONENT_WITH_ID( FunTupl +eBase, "FunTupleBase_Particles" ) DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_MCParticles" ) -- GitLab From fa82afc696cced1ca564c24f6c413a63d46e094b Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Tue, 28 Sep 2021 15:46:45 +0000 Subject: [PATCH 05/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/16563623 --- Phys/FunTuple/src/FunTuple.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 5e794d23..25b652b9 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -913,6 +913,5 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH return; } -DECLARE_COMPONENT_WITH_ID( FunTupl -eBase, "FunTupleBase_Particles" ) +DECLARE_COMPONENT_WITH_ID( FunTupl eBase, "FunTupleBase_Particles" ) DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_MCParticles" ) -- GitLab From 149b958a16768e5f48c17bdbad72bd1d8b96bfeb Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Wed, 29 Sep 2021 09:30:07 +0200 Subject: [PATCH 06/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 25b652b9..6a81a3f2 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -880,7 +880,6 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L // Monitoring the size of the current event template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { - // Messaging service MsgStream log = this->info(); if ( p.empty() ) { -- GitLab From bdf4e9cb36b90fcb559117403b4b64b7d59b70e7 Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 30 Sep 2021 10:16:05 +0200 Subject: [PATCH 07/82] Update .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 18c3a131..484690fd 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,7 @@ i686-winxp-vc9-dbg/ .*-slc[56]-*.d/ .i686-winxp-vc9-dbg.d/ .clang-format + +# Environment files (VSCode) +**/.vscode +.env -- GitLab From c666a2ebff9da01e855ad368b21f7069d6cd5887 Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 30 Sep 2021 10:17:33 +0200 Subject: [PATCH 08/82] Remove env files --- .env | 332 ---------------------------------- .vscode/c_cpp_properties.json | 19 -- .vscode/settings.json | 220 ---------------------- 3 files changed, 571 deletions(-) delete mode 100644 .env delete mode 100644 .vscode/c_cpp_properties.json delete mode 100644 .vscode/settings.json diff --git a/.env b/.env deleted file mode 100644 index c8958c7b..00000000 --- a/.env +++ /dev/null @@ -1,332 +0,0 @@ -COMMONPARTICLESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/CommonParticles -MUONMATCHROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonMatch -CALOFUTUREMONIDSTOPTS=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/options -PARTPROPROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp -HLTINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/HltInterfaces -FSRALGSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/FSRAlgs -MUONDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/MuonDet -CALOFUTUREDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureDAQ -MUONTRACKALIGNROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackAlign -RICHKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichKernel -LHCBMATHROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath -CALOFUTUREUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils -FIELDMAPROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/FieldMap/v5r7 -DECAYTREETUPLEHERSCHELROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleHerschel -KALMANFILTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/KalmanFilter -SELALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelAlgorithms -CALOFUTUREMONIDSTROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst -MAGNETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/Magnet -CALOUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloUtils -CALOFUTURERECOROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureReco -UTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/UT/UTDAQ -HCDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/HC/HCDAQ -HOSTNAME=grid-ui.physik.uzh.ch -CALODETXMLCNVROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/CaloDetXmlCnv -CCACHE_NOHASHDIR=1 -CCACHE_DEPEND=1 -DAVINCIFILTERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciFilters -SELTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelTools -RICHFUTUREALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichFutureAlgorithms -MUONDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Muon/MuonDAQ -FTDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/FTDet -ROOT_INCLUDE_PATH=/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase/include:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/include:/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cppgsl/3.1.0-7a1b6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jsonmcpp/3.9.1-72770/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include/eigen3:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Vc/1.4.1p1-71105/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include/python3.8:/cvmfs/lhcb.cern.ch/lib/lcg/releases/AIDA/3.2.1-3fe9f/x86_64-centos7-gcc10-opt/src/cpp:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rangev3/0.11.0-79ab4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/collier/1.2.4-bf1b5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/veccore/0.6.0-43a04/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/spdlog/1.5.0-d6cb3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gtest/1.10.0-b11fe/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/eigen/3.3.7-642a5/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/include:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/include/c++/10.1.0/x86_64-pc-linux-gnu -PARTICLEMAKERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ParticleMaker -LOKIARRAYFUNCTORSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiArrayFunctors -BBDECTREETOOLROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/BBDecTreeTool -LUMIALGSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs -MUONKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Muon/MuonKernel -DETDESCEXAMPLEROOT=/disk/users/mferrill/lhcbstack/LHCb/Ex/DetDescExample -ASSOCIATORSBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsBase -TERM=xterm-256color -CCACHE_SLOPPINESS=locale,system_headers -DAVINCITRACKREFITTINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting -LOKIPHYSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiPhys -LOKIJETSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiJets -LOKIROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKi -TRACKEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/TrackEvent -LINKERINSTANCESROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances -LINKEREVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerEvent -MAKEFLAGS= -LBENV_CURRENT_WORKSPACE=/disk/users/mferrill/lhcbstack -PRCONFIGROOT=/disk/users/mferrill/lhcbstack/DBASE/PRConfig/v999r999 -DECAYTREETUPLEJETSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleJets -PRKALMANFILTERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PrKalmanFilter -RICHFUTURERECTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecTools -MUONTRACKRECROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackRec -UTASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTAssociators -RICHALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichAlgorithms -HLTEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/HltEvent -TMPDIR=/run/user/21343 -JETACCESSORIESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/JetAccessories -GAUDICONFUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils -OPENBLAS_NUM_THREADS=1 -JETTAGGINGROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/JetTagging -PATFITPARAMSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatFitParams -XMLSUMMARYBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase -RECEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/RecEvent -CCACHE_LOGFILE=/disk/users/mferrill/lhcbstack/.output/ccache.log -UTCHECKERSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTCheckers -RICHMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichMCTools -LOKINUMBERSROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiNumbers -ANALYSISPYTHONROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython -RICHFUTURETOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichFutureTools -GAUDI_QMTEST_CLASS=LHCbTest -DAVINCITOOLSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTools -ASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Associators/Associators -X509_CERT_DIR=/cvmfs/lhcb.cern.ch/etc/grid-security/certificates -LHCBRELEASES=/cvmfs/lhcb.cern.ch/lib/lhcb -DAVINCINEUTRALTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciNeutralTools -MICRODSTTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTTools -TRACKASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackAssociators -MUONTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTools -TRACKKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackKernel -GAUDIGSLROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiGSL -CALOFUTUREINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureInterfaces -LBENV_ALIASES=/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/lib/python3.8/site-packages/LbEnv/data/aliases.sh -PARTICLE2MCTRUTHROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/Particle2MCTruth -LOKITRACKSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiTracks -MDFROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/MDF -STAGE_HOST=castorlhcb.cern.ch -LC_ALL=C -DECAYTREETUPLEANNPIDROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleANNPID -GLOBALRECOROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalReco -CALOASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Calo/CaloAssociators -LHCBKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbKernel -FTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/FT/FTDAQ -PHYSEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/PhysEvent -PRCONVERTERSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrConverters -TRACKINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackInterfaces -VPKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/VP/VPKernel -MICRODSTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/MicroDst -DUMMYPRODUCERSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DummyProducers -DAQUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQUtils -USER=mferril -DECAYTREETUPLEMUONCALIBROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleMuonCalib -PHYSSELPYTHONROOT=/disk/users/mferrill/lhcbstack/Phys/PhysSel/PhysSelPython -MICRODSTBASEROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTBase -RICHFUTUREMCUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureMCUtils -IOEXAMPLEROOT=/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample -DETDESCSVCROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescSvc -LD_LIBRARY_PATH=/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/AnalysisPython:/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/catboost/0.9.1.1-aaad8/x86_64-centos7-gcc10-opt/catboost/libs/model_interface:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GitCondDB/0.2.0-b068a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam_contrib/2.0-779ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/openloops/2.1.2-55918/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libunwind/1.3.1-2fa0a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zlib/1.2.11-8af4c/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/yamlcpp/0.6.3-d05b2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/VecGeom/v1.1.8-b8a75/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/vdt/0.4.3-992df/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tricktrack/1.0.9-829d0/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tbb/2020_U2-daa7e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/podio/00.13-62e4a/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pixman/0.38.4-46112/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/msgpackc/3.2.0-c4011/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxkbcommon/0.7.1-8c5b7/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libsodium/1.0.18-0b20d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libgit2/1.0.1-eb69e/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libffi/3.2.1-26487/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libaio/0.3.110-1-3a85a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepPDT/2.06.01-dba76/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gl2ps/1.4.0-2afdb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/freetype/2.10.0-08d63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fmt/7.1.3-18428/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fjcontrib/1.044-befff/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cfitsio/3.48-e4bb8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Boost/1.75.0-6a4e8/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/EDM4hep/00.03-07115/x86_64-centos7-gcc10-opt/lib64:/cvmfs/lhcb.cern.ch/lib/lcg/releases/HepMC/2.06.11-d5a39/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/RELAX/root6-608a5/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/lib64 -X509_VOMSES=/cvmfs/lhcb.cern.ch/etc/grid-security/vomses -CMTCONFIG=x86_64_v2-centos7-gcc10-opt -MICRODSTCONFROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTConf -RICHFUTURERECPIXELALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecPixelAlgorithms -FSREVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/FSREvent -EVENTSYSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventSys -CCACHE_DIR=/disk/users/mferrill/lhcbstack/.ccache/x86_64_v2-centos7-gcc10-opt -DECAYTREETUPLEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple -PARTICLECOMBINERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ParticleCombiners -DECAYTREEFITTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DecayTreeFitter -CALOKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel -TMVAWEIGHTSROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PARAM/TMVAWeights/v1r17 -CHARGEDPROTOANNPIDPARAMROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/PARAM/ChargedProtoANNPIDParam/v1r7 -SELPYROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/SelPy -PARTICLECONVERTERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ParticleConverters -PRVELOUTROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrVeloUT -SIMCOMPONENTSROOT=/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents -RICHUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichUtils -PHYSCONFROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/PhysConf -DAVINCITRANSPORTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciTransporter -MUONASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Muon/MuonAssociators -RICHFUTUREUTILSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureUtils -CALODETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/CaloDet -DECFILESOPTS=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/Gen/DecFiles/v31r8/options -VERTEXFITROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/VertexFit -DAVINCIKERNELROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciKernel -PARAMETERIZEDKALMANROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/ParameterizedKalman -GITENTITYRESOLVERROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver -LHCBDOC=/eos/project/l/lhcbwebsites/www/projects -LCG_VERSION=100 -LBENV_SOURCED=2.1.2 -DECAYTREETUPLEMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleMC -LOKIPROTOPARTICLESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiProtoParticles -MUONTRACKMONITORROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor -TRACKUTILSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackUtils -VPALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPAlgorithms -MICRODSTINTERFACESROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTInterfaces -GLOBALRECOMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools -MUONINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonInterfaces -MCASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/LHCb/Associators/MCAssociators -VIRTUAL_ENV_DISABLE_PROMPT=1 -RICHFUTURERECSYSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys -RICHINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichInterfaces -HLTDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HltDAQ -DECAYTREETUPLEBASEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleBase -LUMINOSITYROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/Luminosity -RECREATEPIDTOOLSROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/RecreatePIDTools -DETDESCCHECKSROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks -CALODAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ -MYSITEROOT=/cvmfs/lhcb.cern.ch/lib -LCG_RELEASES=/cvmfs/lhcb.cern.ch/lib/lcg/releases -LOKIFITTERSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiFitters -FASTPVROOT=/disk/users/mferrill/lhcbstack/Rec/Tf/FastPV -TRACKSYSROOT=/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys -LHCBTRACKINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Tr/LHCbTrackInterfaces -ZEROMQROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/ZeroMQ -MCINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/MCInterfaces -GAUDI_QMTEST_MODULE=GaudiConf.QMTest.LHCbTest -SITOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Si/SiTools -PATH=/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qd/2.3.13-9e645/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/starlight/r313-eaf9e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/qgraf/3.1.4-23be6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/njet/2.0.0-32061/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/FORM/4.1-8059a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/looptools/2.15-5beb1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/feynhiggs/2.10.2-461cb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/srm-ifce/1.13.0-0-be254/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/gfal/1.13.0-0-6fc75/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Grid/dcap/2.47.7-1-cdd28/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zeromq/4.3.2-3b844/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xqilla/2.3.4-c5cd1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/XercesC/3.2.3-714f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xapian/1.4.11-02310/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/texinfo/6.3-21d20/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/SIO/00.01.00-6e311/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/swig/4.0.2-3be64/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sqlite/3320300-3c47f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/qt5/5.12.4-3d860/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pprof/54271f7-7afca/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/png/1.6.37-5186a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkg_config/0.29.2-c6baf/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pcre/8.43-5c0c1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pango/1.40.13-dc9ba/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oracle/19.3.0.0.0-0ceff/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mysql/10.4.12-4e9a2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/m4/1.4.18-89870/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lz4/1.9.2-9bdfe/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCIO/02.16.01-d5815/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxslt/1.1.34-a0f53/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libxml2/2.9.10-9cd93/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/libtool/2.4.2-9ad34/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jemalloc/5.2.1-8154a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/harfbuzz/1.9.0-54c61/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/GSL/2.6-ecdfc/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz/2.40.1-11724/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperftools/2.9.1-f56d9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gperf/3.1-699d7/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_runewidth/703b5e6-ec180/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_readline/2972be2-02db8/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_liner/6f820f8-5ab05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go_demangle/5e5cf60-84b17/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/go/1.12.5-ff8e6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gdb/10.1-37b91/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fontconfig/2.13.1-241fb/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flex/2.6.4-4c6ad/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fftw3/3.3.8-102c2/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/fastjet/3.3.4-0d9d5/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/expat/2.2.6-ad2fa/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/doxygen/1.8.18-79376/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/delphes/3.4.3pre09-60f6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Davix/0.7.6-83803/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/CppUnit/1.14.0-b79b3/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/clhep/2.4.4.0-b903d/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cairo/1.17.2-f2c05/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/blas/0.3.10.openblas-a9d2a/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/bison/3.3.2-929f9/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/automake/1.16.1-aa1ac/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/autoconf/2.69-01523/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/assimp/5.0.1-6ee63/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hdf5/1.10.6-a3b1e/x86_64-centos7-gcc10-opt/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/bin:/cvmfs/lhcb.cern.ch/lib/lcg/releases/binutils/2.34-990b2/x86_64-centos7/bin:/disk/users/mferrill/lhcbstack/contrib/bin:/cvmfs/lhcb.cern.ch/lib/bin/x86_64-centos7:/cvmfs/lhcb.cern.ch/lib/bin/Linux-x86_64:/cvmfs/lhcb.cern.ch/lib/bin:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/bin:/usr/bin -FTEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/FTEvent -DAQEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DAQEvent -UTDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/UTDet -LHCBNIGHTLIES=/cvmfs/lhcbdev.cern.ch/nightlies -LC_MESSAGES=C -SELKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/SelKernel -CALOFUTUREPIDSROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFuturePIDs -CALOTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Calo/CaloTools -HLTSERVICESROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HltServices -DETDESCROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDesc -FUNCTORCACHEROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCache -PRKERNELROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrKernel -UTALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTAlgorithms -LOKIHLTROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiHlt -PWD=/disk/users/mferrill/lhcbstack -RECINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecInterfaces -PRPIXELROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrPixel -MUONIDROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonID -UTMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTMonitors -SIDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Si/SiDAQ -MDF_ROOTROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/MDF_ROOT -RAWEVENTFORMATROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9 -PARTICLEMAKERCHECKERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/ParticleMakerChecker -DAVINCITYPESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciTypes -RICHMCMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichMCMonitors -MICRODSTALGORITHMROOT=/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTAlgorithm -RICHFUTURERECBASEROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecBase -LOKITRACKROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack -RAWEVENTCOMPATROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat -LANG=C -SELREPORTSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/SelReports -TRACKCHECKERSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackCheckers -KERASROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/keras -TRACKTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackTools -TRACKMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMCTools -FILESTAGERROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager -GENEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/GenEvent -X509_VOMS_DIR=/etc/grid-security/vomsdir -LBENV_PREFIX=/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64 -COMPILER_PREFIX=/disk/users/mferrill/lhcbstack/utils/../contrib/bin/ccache -DSTWRITERSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters -MVADICTTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/MVADictTools -FTMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/FT/FTMonitors -DAQMONITORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/DAQ/DAQMonitors -PYCONFROOT=/disk/users/mferrill/lhcbstack/LHCb/PyConf -DETCONDROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond -CALOINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloInterfaces -CMAKE_MAKE_PROGRAM=/disk/users/mferrill/lhcbstack/contrib/bin/ninja -DAVINCITRACKSCALINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling -DAVINCIINTERFACESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciInterfaces -PRALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrAlgorithms -RICHFUTUREKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureKernel -PHYSINTERFACESROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/PhysInterfaces -DECFILESROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/Gen/DecFiles/v31r8 -MUONPIDCHECKERROOT=/disk/users/mferrill/lhcbstack/Rec/Muon/MuonPIDChecker -UTTELL1EVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/UT/UTTELL1Event -VPDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/VPDet -BCMDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/BcmDet -HLTTCKROOT=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/TCK/HltTCK/v3r19p28 -DAVINCIDECAYFINDERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciDecayFinder -PROTOPARTICLEFILTERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ProtoParticleFilter -GAUDICONFROOT=/disk/users/mferrill/lhcbstack/LHCb/GaudiConf -CCACHE_BASEDIR=/disk/users/mferrill/lhcbstack/Analysis -TISTOSTOBBINGROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/TisTosTobbing -EXTRAINFOTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/ExtraInfoTools -PRMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrMCTools -ENV_CMAKE_SOURCE_DIR=/disk/users/mferrill/lhcbstack/Analysis -HIGHPTJETSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/HighPtJets -MCEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/MCEvent -RICHPIDQCROOT=/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC -LCG_hostos=x86_64-centos7 -HOME=/home/hep/mferril -SHLVL=1 -LOKIALGOMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC -RELATEDINFOTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/RelatedInfoTools -LOKIALGOROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiAlgo -LOKICOREROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore -XMLSUMMARYKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel -ALLOCATIONTRACKERROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/AllocationTracker -RICHFUTURERECINTERFACESROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecInterfaces -RECALGSROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecAlgs -XMLTOOLSROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/XmlTools -LOCAL_POOL_DEPTH=24 -DECAYTREETUPLERECOROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleReco -DAVINCIMCTOOLSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciMCTools -DAVINCIOVERLAPSANDCLONESROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciOverlapsAndClones -RICHFUTUREGLOBALPIDROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureGlobalPID -RICHFUTURERECALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecAlgorithms -NINJA_STATUS=[%u>%r>%f/%t] -RICHFUTURERECMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecMonitors -RICHFUTURERECTRACKALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecTrackAlgorithms -CHARGEDPROTOANNPIDROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/ChargedProtoANNPID -LHCBALGSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs -EVENTPACKERROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventPacker -DDDBROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB -LOKIPHYSMCROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC -DAVINCIMCKERNELROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciMCKernel -VPASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPAssociators -RICHDETECTORSROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichDetectors -LOKIMCROOT=/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC -DIGIEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/DigiEvent -DETDESCCNVROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescCnv -ENV_CMAKE_BUILD_TYPE=Release -PYTHONPATH=/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/ParticleMakerChecker/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/Particle2MCTruth/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiPhysMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/LoKiAlgoMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/FunTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DSTWriters/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTrigger/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleTracking/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleReco/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMuonCalib/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleMC/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleJets/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleHerschel/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleDalitz/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleBase/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTupleANNPID/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DecayTreeTuple/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackScaling/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTrackRefitting/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciMCTools/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciDecayFinder/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt/Phys/DaVinciAssociators/genConfDir:/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/:/disk/users/mferrill/lhcbstack/Analysis/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Phys/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Rec/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Lbcom/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/LHCb/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/disk/users/mferrill/lhcbstack/Gaudi/InstallArea/x86_64_v2-centos7-gcc10-opt/python:/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/zipp/0.5.1-80542/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wrapt/1.11.1-f9767/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/werkzeug/0.15.4-0963b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/wcwidth/0.1.7-d9bfe/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/urllib3/1.25.3-011e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/traitlets/4.3.2-79480/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tornado/5.1.1-c3207/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/termcolor/1.1.0-53dbb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/sortedcontainers/2.1.0-f643e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/six/1.12.0-f083a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/simplegeneric/0.8.1-6c6c6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools_scm/3.3.3-e036f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scandir/1.10.0-f348f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/retrying/1.3.3-688da/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests_oauthlib/1.2.0-aaad4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests/2.22.0-11042/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytz/2019.1-08128/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/python_dateutil/2.8.0-9ff92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest_runner/5.1-19882/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyparsing/2.4.0-6a86f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot_ng/2.0.0-d8af2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot/1.4.1-d8114/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycparser/2.19-6a30e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1_modules/0.2.5-07fd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1/0.4.5-a72f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/py/1.9.0-e4ba6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ptyprocess/0.6.0-e6e90/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pluggy/0.13.1-86414/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/plotly/4.5.0-28a4e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkgconfig/1.5.1-5c0e3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pillow/6.2.2-5bfe8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pickleshare/0.7.5-a69d8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pexpect/4.7.0-2ac74/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathlib2/2.3.3-12564/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/parso/0.4.0-c5561/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/packaging/19.0-11c14/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/oauthlib/3.0.1-d2f8b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/multiprocess/0.70.10-c12ef/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mpmath/1.1.0-937c2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/mock/3.0.5-79169/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/messaging/1.1-58db2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/MarkupSafe/1.0-5c35d/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/lxml/4.6.2-fd87e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/kiwisolver/1.0.1-e6ad1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_applications/1.0.8-d29c8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras/2.2.4-07b79/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Jinja2/2.11.2-d6c2f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/jedi/0.13.3-8fbb8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython_genutils/0.2.0-94aa5/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/iniconfig/1.1.1-50696/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/importlib_metadata/2.0.0-30aeb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/idna/2.8-6e42a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz_py/0.11.1-f449f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth/1.6.3-0a1e8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/funcsigs/1.0.2-94a5e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/decorator/4.3.2-e21fb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cycler/0.10.0-94dd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/click/7.0-a8864/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cffi/1.12.2-7f42b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/certifi/2019.3.9-dde3e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cachetools/3.1.1-3bdaf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backports/1.0.0-17ff0/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/backcall/0.1.0-032cd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/attrs/19.3.0-6eb83/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/atomicwrites/1.3.0-38de1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astunparse/1.6.3-c0056/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/astor/0.8.1-cb8d6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/asn1crypto/0.24.0-40338/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/absl_py/0.11.0-489c4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pandas/1.2.2-5fc1a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow_estimator/2.3.0-4915e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/grpcio/1.28.1-d97df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/opt_einsum/3.2.0-3d6fc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/more_itertools/7.0.0-1f3ed/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/toml/0.10.2-d1026/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/scipy/1.5.1-562d3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyyaml/5.3.1-18c69/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/cryptography/3.3.2-00716/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_preprocessing/1.1.2-8cb53/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/hypothesis/5.3.0-bcc92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/h5py/2.10.0-c6f13/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/gast/0.3.3-6accc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages:/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages -PARAMFILESROOT=/disk/users/mferrill/lhcbstack/PARAM/ParamFiles/v999r999 -RECCONFROOT=/disk/users/mferrill/lhcbstack/Rec/Rec/RecConf -PATCHECKERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatChecker -TRACKMONITORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors -VPDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/VP/VPDAQ -LHCBDEV=/afs/cern.ch/lhcb/software/DEV -GENERICVERTEXFINDERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/GenericVertexFinder -LUMIEVENTROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/LumiEvent -LBDD4HEPROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/LbDD4hep -STDOPTS=/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/options -CCACHE_TEMPDIR=/run/user/21343/ccache -LC_CTYPE=C -VPCHECKERSROOT=/disk/users/mferrill/lhcbstack/Lbcom/VP/VPCheckers -EMACSDIR=/cvmfs/lhcb.cern.ch/lib/lhcb/TOOLS/Tools/Emacs/pro -FUNTUPLEROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple -DECAYTREETUPLETRACKINGROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleTracking -RICHRECUTILSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichRecUtils -GAUDITENSORFLOWROOT=/disk/users/mferrill/lhcbstack/LHCb/Tools/GaudiTensorFlow -RELATIONSROOT=/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations -HLTSCHEDULERROOT=/disk/users/mferrill/lhcbstack/LHCb/Hlt/HLTScheduler -DECAYTREETUPLETRIGGERROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleTrigger -LWTNNPARSERROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/lwtnnParser -FLAVOURTAGGINGROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/FlavourTagging -FUNCTORCOREROOT=/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore -UTTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/UT/UTTools -LBCOMSYSROOT=/disk/users/mferrill/lhcbstack/Lbcom/LbcomSys -PRVPRETINAROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrVPRetina -TRACKEXTRAPOLATORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackExtrapolators -RICHDETROOT=/disk/users/mferrill/lhcbstack/LHCb/Det/RichDet -DAQSYSROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys -TRACKFITEVENTROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitEvent -XDG_RUNTIME_DIR=/run/user/21343 -DISPLAY=localhost:13.0 -CMAKE_PREFIX_PATH=/disk/users/mferrill/lhcbstack:/cvmfs/lhcb.cern.ch/lib/lhcb:/cvmfs/lhcb.cern.ch/lib/lcg/releases:/cvmfs/lhcb.cern.ch/lib/lcg/app/releases:/cvmfs/lhcb.cern.ch/lib/lcg/external:/cvmfs/lhcb.cern.ch/lib/contrib:/cvmfs/lhcb.cern.ch/lib/var/lib/LbEnv/2090/stable/linux-64/lib/python3.8/site-packages/LbDevTools/data/cmake:/cvmfs/sft.cern.ch/lcg/releases -BINARY_TAG=x86_64_v2-centos7-gcc10-opt -RICHFUTURERECCHECKERSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecCheckers -RICHFUTURERECPHOTONALGORITHMSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecPhotonAlgorithms -TRACKFITTERROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitter -RICHTOOLSROOT=/disk/users/mferrill/lhcbstack/Lbcom/Rich/RichTools -OMP_THREAD_LIMIT=1 -ENV_CMAKE_BINARY_DIR=/disk/users/mferrill/lhcbstack/Analysis/build.x86_64_v2-centos7-gcc10-opt -SCIFITRACKFORWARDINGROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/SciFiTrackForwarding -UTKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/UT/UTKernel -LCG_external_area=/cvmfs/lhcb.cern.ch/lib/lcg/external -DAVINCIASSOCIATORSROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciAssociators -PATPVROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/PatPV -RICHFUTURERECEVENTROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecEvent -PRFITPARAMSROOT=/disk/users/mferrill/lhcbstack/Rec/Pr/PrFitParams -EVENTASSOCROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventAssoc -DAQKERNELROOT=/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQKernel -DECAYTREETUPLEDALITZROOT=/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTupleDalitz -LOKIUTILSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiUtils -TRACKPROJECTORSROOT=/disk/users/mferrill/lhcbstack/Rec/Tr/TrackProjectors -DAVINCIPVTOOLSROOT=/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciPVTools -RICHRECTESTSROOT=/disk/users/mferrill/lhcbstack/Rec/Rich/RichRecTests -CALOFUTURETOOLSROOT=/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureTools -RICHFUTUREDAQROOT=/disk/users/mferrill/lhcbstack/LHCb/Rich/RichFutureDAQ -EVENTBASEROOT=/disk/users/mferrill/lhcbstack/LHCb/Event/EventBase diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index 2b6f2d6d..00000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "configurations": [ - { - "compileCommands": "/disk/users/mferrill/lhcbstack/.output/compile_commands-Analysis.json", - "compilerPath": "/cvmfs/lhcb.cern.ch/lib/lcg/releases/gcc/10.1.0-6f386/x86_64-centos7/bin/g++", - "includePath": [ - "../Analysis/**", - "../Phys/**", - "../Rec/**", - "../Lbcom/**", - "../LHCb/**", - "../Detector/**", - "../Gaudi/**" - ], - "name": "Linux" - } - ], - "version": 4 -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 2a7b7f16..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "python.analysis.extraPaths": [ - "/cvmfs/lhcb.cern.ch/lib/lhcb/DBASE/RawEventFormat/v1r9/python", - "/disk/users/mferrill/lhcbstack/Analysis/Rich/RichPIDQC/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiPhysMC/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/LoKiAlgoMC/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/FunTuple/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DSTWriters/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DecayTreeTuple/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackScaling/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/DaVinciTrackRefitting/python/", - "/disk/users/mferrill/lhcbstack/Analysis/Phys/AnalysisPython/python/", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/DD4hep/01.16.01-491e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/v6.24.00-a725e/x86_64-centos7-gcc10-opt/lib", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/gosam/2.0.4-faf33/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/rivet/3.1.4-594d4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MCGenerators/yoda/1.9.0-65925/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/zipp/0.5.1-80542/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/xrootd/5.1.1-86ebf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/xgboost/0.90-8cf80/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/wrapt/1.11.1-f9767/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/wheel/0.33.4-dc708/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/werkzeug/0.15.4-0963b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/wcwidth/0.1.7-d9bfe/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/urllib3/1.25.3-011e6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/traitlets/4.3.2-79480/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tornado/5.1.1-c3207/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/theano/1.0.4-79ff3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/termcolor/1.1.0-53dbb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/sympy/1.4-76a85/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/sortedcontainers/2.1.0-f643e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/six/1.12.0-f083a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/simplegeneric/0.8.1-6c6c6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools_scm/3.3.3-e036f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/setuptools/44.1.0-27e03/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/scandir/1.10.0-f348f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/rsa/4.0-f2b0f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/retrying/1.3.3-688da/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests_oauthlib/1.2.0-aaad4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/requests/2.22.0-11042/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytz/2019.1-08128/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/python_dateutil/2.8.0-9ff92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest_runner/5.1-19882/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyparsing/2.4.0-6a86f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pygments/2.4.2-5f9a9/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot_ng/2.0.0-d8af2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pydot/1.4.1-d8114/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycparser/2.19-6a30e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pycairo/1.18.1-afd39/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1_modules/0.2.5-07fd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyasn1/0.4.5-a72f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/py/1.9.0-e4ba6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ptyprocess/0.6.0-e6e90/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ppft/1.6.4.9-305cf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pox/0.2.5-7da5b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pluggy/0.13.1-86414/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/plotly/4.5.0-28a4e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pkgconfig/1.5.1-5c0e3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pillow/6.2.2-5bfe8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pickleshare/0.7.5-a69d8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pexpect/4.7.0-2ac74/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pbr/5.2.1-db284/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathos/0.2.3-644ae/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pathlib2/2.3.3-12564/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/parso/0.4.0-c5561/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/packaging/19.0-11c14/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/oauthlib/3.0.1-d2f8b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/nose/1.3.7-5b609/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/multiprocess/0.70.10-c12ef/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/mpmath/1.1.0-937c2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/mock/3.0.5-79169/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/messaging/1.1-58db2/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/MarkupSafe/1.0-5c35d/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/markdown/3.1.1-b42d1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/lxml/4.6.2-fd87e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/kiwisolver/1.0.1-e6ad1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_applications/1.0.8-d29c8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras/2.2.4-07b79/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/Jinja2/2.11.2-d6c2f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/jedi/0.13.3-8fbb8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython_genutils/0.2.0-94aa5/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/iniconfig/1.1.1-50696/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/importlib_metadata/2.0.0-30aeb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/idna/2.8-6e42a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/graphviz_py/0.11.1-f449f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth_oauthlib/0.4.1-f4142/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/google_auth/1.6.3-0a1e8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/future/0.17.1-4b8df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/funcsigs/1.0.2-94a5e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/flatbuffers/1.12.0-8b9fd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/dill/0.3.2-0b1f6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/decorator/4.3.2-e21fb/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cython/0.29.21-ac1ee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cycler/0.10.0-94dd8/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/coverage/4.5.3-4db6b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/click/7.0-a8864/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/chardet/3.0.4-6c479/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cffi/1.12.2-7f42b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/certifi/2019.3.9-dde3e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cachetools/3.1.1-3bdaf/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/backports/1.0.0-17ff0/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/backcall/0.1.0-032cd/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/babel/2.9.0-89984/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/attrs/19.3.0-6eb83/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/atomicwrites/1.3.0-38de1/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/astunparse/1.6.3-c0056/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/astor/0.8.1-cb8d6/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/asn1crypto/0.24.0-40338/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/absl_py/0.11.0-489c4/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pip/21.0.1-e6783/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pandas/1.2.2-5fc1a/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/torch/1.7.0-e9600/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorboard/2.3.0-59e16/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow_estimator/2.3.0-4915e/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/tensorflow/2.3.0-f0385/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/grpcio/1.28.1-d97df/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/opt_einsum/3.2.0-3d6fc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/numpy/1.18.2-be00f/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/more_itertools/7.0.0-1f3ed/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/toml/0.10.2-d1026/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/scipy/1.5.1-562d3/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pytest/6.1.1-c572c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.8.6-3199b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/pyyaml/5.3.1-18c69/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/cryptography/3.3.2-00716/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/keras_preprocessing/1.1.2-8cb53/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ipython/7.5.0-67cee/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/hypothesis/5.3.0-bcc92/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/h5py/2.10.0-c6f13/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/gast/0.3.3-6accc/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/matplotlib/3.3.4-09259/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/networkx/2.3-c7b5c/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/prompt_toolkit/2.0.9-5446b/x86_64-centos7-gcc10-opt/lib/python3.8/site-packages", - "/disk/users/mferrill/lhcbstack/Phys/PhysSel/PhysSelPython/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/SelPy/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/PhysConf/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/MVADictTools/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiUtils/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiTracks/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiProtoParticles/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiPhys/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiJets/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiArrayFunctors/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/LoKiAlgo/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/JetTagging/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/JetAccessories/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/FlavourTagging/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/DaVinciPVTools/python/", - "/disk/users/mferrill/lhcbstack/Phys/Phys/CommonParticles/python/", - "/disk/users/mferrill/lhcbstack/Phys/MicroDST/MicroDSTConf/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/RecConf/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tr/PatPV/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecMonitors/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rich/RichFutureRecSys/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/LumiAlgs/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalRecoMCTools/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/GlobalReco/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/ChargedProtoANNPID/python/", - "/disk/users/mferrill/lhcbstack/Rec/Rec/LoKiTrack/python/", - "/disk/users/mferrill/lhcbstack/Rec/Phys/FunctorCore/python/", - "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonTrackMonitor/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tf/TrackSys/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackMonitors/python/", - "/disk/users/mferrill/lhcbstack/Rec/Tr/TrackFitter/python/", - "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonPIDChecker/python/", - "/disk/users/mferrill/lhcbstack/Rec/Muon/MuonID/python/", - "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureReco/python/", - "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFuturePIDs/python/", - "/disk/users/mferrill/lhcbstack/Rec/CaloFuture/CaloFutureMoniDst/python/", - "/disk/users/mferrill/lhcbstack/Lbcom/UT/UTTools/python/", - "/disk/users/mferrill/lhcbstack/Lbcom/Calo/CaloAssociators/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Tools/ZeroMQ/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Tools/GitEntityResolver/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Tools/FileStager/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Sim/SimComponents/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Rich/RichKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/PyConf/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiNumbers/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiMC/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiHlt/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Phys/LoKiCore/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/XMLSummaryBase/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/Relations/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/PartProp/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbMath/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/LHCbAlgs/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Kernel/FSRAlgs/python/", - "/disk/users/mferrill/lhcbstack/LHCb/GaudiConfUtils/python/", - "/disk/users/mferrill/lhcbstack/LHCb/GaudiConf/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Ex/IOExample/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Event/MicroDst/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Event/LinkerInstances/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Det/DetDescChecks/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Det/DetCond/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Det/DDDB/python/", - "/disk/users/mferrill/lhcbstack/LHCb/DAQ/RawEventCompat/python/", - "/disk/users/mferrill/lhcbstack/LHCb/DAQ/DAQSys/python/", - "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureUtils/python/", - "/disk/users/mferrill/lhcbstack/LHCb/CaloFuture/CaloFutureDAQ/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloUtils/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloKernel/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Calo/CaloDAQ/python/", - "/disk/users/mferrill/lhcbstack/LHCb/Associators/AssociatorsBase/python/", - "/cvmfs/lhcb.cern.ch/lib/lcg/releases/LCG_100/ROOT/v6.24.00/x86_64-centos7-gcc10-opt/lib", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiExamples/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiSvc/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPython/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiProfiling/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiMP/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiHive/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/Gaudi/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiConfiguration/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiKernel/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPolicy/python/", - "/disk/users/mferrill/lhcbstack/Gaudi/GaudiPluginService/python/" - ], - "python.envFile": "/disk/users/mferrill/lhcbstack/.output/runtime-Analysis.env" -} \ No newline at end of file -- GitLab From 999de80198cbc44d6232139d1fd1f0f0f985c7c2 Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 30 Sep 2021 10:31:56 +0200 Subject: [PATCH 09/82] Update .gitignore --- .gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.gitignore b/.gitignore index 484690fd..48408d28 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,11 @@ i686-winxp-vc9-dbg/ # Environment files (VSCode) **/.vscode .env + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py +.pytest_cache/ -- GitLab From 811e58e29743b66e3462e7afd3eaed048c4c1fb1 Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Thu, 30 Sep 2021 10:35:22 +0200 Subject: [PATCH 10/82] Apply 1 suggestion(s) to 1 file(s) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 48408d28..e6c0c841 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,5 @@ i686-winxp-vc9-dbg/ # IPython profile_default/ ipython_config.py + .pytest_cache/ -- GitLab From 8b3cef58a821c63431da8257aa1f7412544b4b7c Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 30 Sep 2021 10:35:29 +0200 Subject: [PATCH 11/82] Update .gitignore --- .gitignore | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.gitignore b/.gitignore index 48408d28..9c15767c 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,19 @@ i686-winxp-vc9-dbg/ # IPython profile_default/ ipython_config.py + +# pytest byproducts .pytest_cache/ + +# QMTest byproducts +*.new +**/tests/qmtest/*.* +!**/tests/qmtest/*.qms +!**/tests/qmtest/*.qmt + +# Sphinx by-products +doc/_env* +doc/_build +doc/graphviz +doc/selection/thor_functors_reference.generated.rst + -- GitLab From b4a58726615545581ec2a5ad93e21abfc86beb7f Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 30 Sep 2021 16:08:37 +0200 Subject: [PATCH 12/82] Include Tupling of arrays of double, 3x3 matrices (and typos fix) --- Phys/FunTuple/python/FunTuple/common_util.py | 4 +- Phys/FunTuple/src/FunTuple.cpp | 41 ++++++++++++++++++-- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/Phys/FunTuple/python/FunTuple/common_util.py b/Phys/FunTuple/python/FunTuple/common_util.py index dad81035..a32d2c2a 100644 --- a/Phys/FunTuple/python/FunTuple/common_util.py +++ b/Phys/FunTuple/python/FunTuple/common_util.py @@ -72,7 +72,7 @@ def conduct_checks_and_transform(input_args): variables_all = variables[vk] if not isinstance(variables_all, FunctorCollection): raise TypeError( - 'The variables for the branch name {0} is not of type FunctorCollectoin but of type {1}. Please check!' + 'The variables for the branch name {0} is not of type FunctorCollection but of type {1}. Please check!' .format(vk, type(variables_all))) else: variables_keys_wo_ALL += [vk] @@ -101,7 +101,7 @@ def conduct_checks_and_transform(input_args): funct_coll_k = variables[k] if not isinstance(funct_coll_k, FunctorCollection): raise TypeError( - 'The variables for the branch name {0} is not of type FunctorCollectoin. Please check!' + 'The variables for the branch name {0} is not of type FunctorCollection. Please check!' .format(k)) if variables_all: diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 6a81a3f2..eda1239e 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -18,6 +18,7 @@ #include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/Vector3DTypes.h" #include "GaudiKernel/Vector4DTypes.h" +#include "GaudiKernel/SymmetricMatrixTypes.h" // Event #include "Event/MCParticle.h" @@ -41,6 +42,9 @@ // boost #include +// standard exception +#include + // custom class #include "ParticleTupleProp.h" @@ -137,6 +141,7 @@ private: LHCb::FTuple::VECT_VECT_STRINGS m_returntypes_loki; // return types (vectors where returntypes are actually stored) Gaudi::Property> m_preamble_def_loki{this, "loki_preamble", {}, "List of preamble strings"}; std::string m_preamble_loki; + unsigned int m_maxSizeArray; /// Max buffer size for arrays // Loki functor factory ToolHandle m_factory_loki = {"LoKi::Hybrid::Tool/HybridFactory:PUBLIC", this}; ToolHandle m_mcfactory_loki = {"LoKi::Hybrid::MCTool/MCHybridFactory:PUBLIC", this}; @@ -177,6 +182,7 @@ private: mutable Gaudi::Accumulators::Counter<> m_multiple_cand_evt{this, "nr of events with multiple candidates"}; void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; + std::string parseVectorName( const std::string& branchname ) const; // make custom data Gaudi::Property m_makeCustomData{ @@ -229,6 +235,8 @@ StatusCode FunTupleBase::initialize() { StatusCode sc_func = instantiate_thor(); if ( sc_func.isFailure() ) { return this->Error( "Error in instantiating ThOr functors" ); } } + // Initialise the max buffers size for arrays to be tupled + m_maxSizeArray = 100; this->info() << "Finished initialisation: " << endmsg; @@ -471,6 +479,11 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( Gaudi::XYZPoint ) ) { return ntuple->column( colname, std::any_cast( val ) ); + } else if ( val.type() == typeid( std::vector ) ) { + std::string array_idxName = parseVectorName( colname ); + return ntuple->farray( colname, std::any_cast>( val ), array_idxName, m_maxSizeArray ); + } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ){ + return ntuple->matrix( colname, std::any_cast( val )); } else { this->err() << "Type value returned by functor not recognised." << endmsg; } @@ -640,13 +653,14 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con for ( unsigned int j = 0; j < ( ptp.FunctorProps_loki() ).size(); j++ ) { ParticleProp::FunctorProp_loki functup = ( ptp.FunctorProps_loki() )[j]; std::string branchname = ptp.BranchName() + "_" + functup.Func_branchname_loki; + std::string funcname = functup.Func_branchname_loki; // store all candidates found in the event for ( const auto& cand : output ) { std::any val = m_fun_loki[i][j]( cand ); // book tuple for LoKi // log << "Loki Value is " << std::any_cast(val) << endmsg; StatusCode sc_book; - sc_book = book_tuple( ntuple, branchname, val ); + sc_book = book_tuple( ntuple, branchname, val); if ( sc_book.isFailure() ) { err << "Unable to book the columns for Loki functors" << endmsg; } } } @@ -896,7 +910,6 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb } template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { - // Messaging service MsgStream log = this->info(); if ( p.empty() ) { @@ -911,6 +924,28 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH } return; } +template +std::string FunTupleBase::parseVectorName( const std::string& branchname ) const { + MsgStream log = this->info(); + std::string idxname = " "; + std::string start_del = "["; + std::string stop_del = "]"; + try + { + idxname = branchname.substr( branchname.find(start_del) + start_del.length(), branchname.find(stop_del) - ( branchname.find(start_del) + start_del.length() ) ); + if ( idxname==start_del || idxname==stop_del + || idxname=="" || idxname==branchname + || idxname==branchname.substr( 0, branchname.find( stop_del ) ) ){ + throw std::invalid_argument("Invalid array index formatting"); + } + } + catch ( std::invalid_argument& ) + { + log << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; + idxname = "idx"; + } + return idxname; +} -DECLARE_COMPONENT_WITH_ID( FunTupl eBase, "FunTupleBase_Particles" ) +DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_Particles" ) DECLARE_COMPONENT_WITH_ID( FunTupleBase, "FunTupleBase_MCParticles" ) -- GitLab From e939251b586ad59911d0cf56e9722e73f782f081 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Thu, 30 Sep 2021 14:09:07 +0000 Subject: [PATCH 13/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/16619194 --- Phys/FunTuple/src/FunTuple.cpp | 35 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index eda1239e..cdfcfa41 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -16,9 +16,9 @@ #include "GaudiKernel/Point3DTypes.h" #include "GaudiKernel/Point4DTypes.h" #include "GaudiKernel/ServiceHandle.h" +#include "GaudiKernel/SymmetricMatrixTypes.h" #include "GaudiKernel/Vector3DTypes.h" #include "GaudiKernel/Vector4DTypes.h" -#include "GaudiKernel/SymmetricMatrixTypes.h" // Event #include "Event/MCParticle.h" @@ -180,8 +180,8 @@ private: mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr of processed events"}; mutable Gaudi::Accumulators::Counter<> m_nonempty_evt{this, "nr of non-empty events"}; mutable Gaudi::Accumulators::Counter<> m_multiple_cand_evt{this, "nr of events with multiple candidates"}; - void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; - void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; + void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; + void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; std::string parseVectorName( const std::string& branchname ) const; // make custom data @@ -482,8 +482,8 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: } else if ( val.type() == typeid( std::vector ) ) { std::string array_idxName = parseVectorName( colname ); return ntuple->farray( colname, std::any_cast>( val ), array_idxName, m_maxSizeArray ); - } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ){ - return ntuple->matrix( colname, std::any_cast( val )); + } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ) { + return ntuple->matrix( colname, std::any_cast( val ) ); } else { this->err() << "Type value returned by functor not recognised." << endmsg; } @@ -660,7 +660,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con // book tuple for LoKi // log << "Loki Value is " << std::any_cast(val) << endmsg; StatusCode sc_book; - sc_book = book_tuple( ntuple, branchname, val); + sc_book = book_tuple( ntuple, branchname, val ); if ( sc_book.isFailure() ) { err << "Unable to book the columns for Loki functors" << endmsg; } } } @@ -924,23 +924,20 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH } return; } -template +template std::string FunTupleBase::parseVectorName( const std::string& branchname ) const { - MsgStream log = this->info(); + MsgStream log = this->info(); std::string idxname = " "; std::string start_del = "["; std::string stop_del = "]"; - try - { - idxname = branchname.substr( branchname.find(start_del) + start_del.length(), branchname.find(stop_del) - ( branchname.find(start_del) + start_del.length() ) ); - if ( idxname==start_del || idxname==stop_del - || idxname=="" || idxname==branchname - || idxname==branchname.substr( 0, branchname.find( stop_del ) ) ){ - throw std::invalid_argument("Invalid array index formatting"); - } - } - catch ( std::invalid_argument& ) - { + try { + idxname = branchname.substr( branchname.find( start_del ) + start_del.length(), + branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); + if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || + idxname == branchname.substr( 0, branchname.find( stop_del ) ) ) { + throw std::invalid_argument( "Invalid array index formatting" ); + } + } catch ( std::invalid_argument& ) { log << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; idxname = "idx"; } -- GitLab From e8a17a0909524f854c4fd84fde5254e9248c8e8d Mon Sep 17 00:00:00 2001 From: mferrill Date: Fri, 1 Oct 2021 10:40:24 +0200 Subject: [PATCH 14/82] Include dynamic Gaudi counters --- Phys/FunTuple/src/FunTuple.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index cdfcfa41..d8205a6f 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -178,8 +178,9 @@ private: // Gaudi monitoring counters mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr of processed events"}; - mutable Gaudi::Accumulators::Counter<> m_nonempty_evt{this, "nr of non-empty events"}; - mutable Gaudi::Accumulators::Counter<> m_multiple_cand_evt{this, "nr of events with multiple candidates"}; + mutable std::vector< Gaudi::Accumulators::Counter<> > m_vec_nonempty_evt; + mutable std::vector< Gaudi::Accumulators::Counter<> > m_vec_multiple_cand_evt; + void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; std::string parseVectorName( const std::string& branchname ) const; @@ -558,6 +559,10 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c } } + std::string head = ptp.BranchName(); + m_vec_nonempty_evt.emplace_back(this, "nr of non empty events for branch "+head); + m_vec_multiple_cand_evt.emplace_back(this, "nr of events with multiple candidates for branch "+head); + // find the MC decay finder.findDecay( input.begin(), input.end(), output ); monitorOutputMCParticle( i, output ); @@ -644,6 +649,10 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con } } + std::string head = ptp.BranchName(); + m_vec_nonempty_evt.emplace_back(this, "nr of non empty events for branch "+head); + m_vec_multiple_cand_evt.emplace_back(this, "nr of events with multiple candidates for branch "+head); + // find the decay finder.findDecay( input.begin(), input.end(), output ); monitorOutputParticle( i, output ); @@ -899,12 +908,12 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; - } else if ( ( !p.empty() ) && idx == 0 ) { - ++m_nonempty_evt; + } else if ( !p.empty() ) { + ++(m_vec_nonempty_evt[idx]); } if ( p.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - if ( idx == 0 ) ++m_multiple_cand_evt; + ++(m_vec_multiple_cand_evt[idx]); } return; } @@ -915,12 +924,12 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; - } else if ( ( !p.empty() ) && idx == 0 ) { - ++m_nonempty_evt; + } else if ( !p.empty() ) { + ++(m_vec_nonempty_evt[idx]); } if ( p.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - if ( idx == 0 ) ++m_multiple_cand_evt; + ++(m_vec_multiple_cand_evt[idx]); } return; } -- GitLab From a8e3a292f5e8a64db7bcfa238a7fd0884833dcb8 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Fri, 1 Oct 2021 10:40:50 +0200 Subject: [PATCH 15/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index d8205a6f..90e7d3c0 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -482,7 +482,7 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( std::vector ) ) { std::string array_idxName = parseVectorName( colname ); - return ntuple->farray( colname, std::any_cast>( val ), array_idxName, m_maxSizeArray ); + return ntuple->farray( colname, std::any_cast const&>( val ), array_idxName, m_maxSizeArray ); } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ) { return ntuple->matrix( colname, std::any_cast( val ) ); } else { -- GitLab From 7dc788e1c8c319ec3a671e1fd995ed685476a567 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Fri, 1 Oct 2021 10:40:55 +0200 Subject: [PATCH 16/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 90e7d3c0..8c1f708c 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -484,7 +484,7 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: std::string array_idxName = parseVectorName( colname ); return ntuple->farray( colname, std::any_cast const&>( val ), array_idxName, m_maxSizeArray ); } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ) { - return ntuple->matrix( colname, std::any_cast( val ) ); + return ntuple->matrix( colname, std::any_cast( val ) ); } else { this->err() << "Type value returned by functor not recognised." << endmsg; } -- GitLab From b09251a4448914b77c40f240f7d0a6db5f105992 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Fri, 1 Oct 2021 10:41:10 +0200 Subject: [PATCH 17/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 8c1f708c..1e166de1 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -939,14 +939,10 @@ std::string FunTupleBase::parseVectorName( const std::string& branchname ) co std::string idxname = " "; std::string start_del = "["; std::string stop_del = "]"; - try { - idxname = branchname.substr( branchname.find( start_del ) + start_del.length(), + idxname = branchname.substr( branchname.find( start_del ) + start_del.length(), branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); - if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || - idxname == branchname.substr( 0, branchname.find( stop_del ) ) ) { - throw std::invalid_argument( "Invalid array index formatting" ); - } - } catch ( std::invalid_argument& ) { + if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || + idxname == branchname.substr( 0, branchname.find( stop_del ) ) { log << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; idxname = "idx"; } -- GitLab From c5fd7dfd1dec00bec006c006e99e121cbedbdfd9 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Fri, 1 Oct 2021 08:41:20 +0000 Subject: [PATCH 18/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/16635785 --- Phys/FunTuple/src/FunTuple.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 1e166de1..84ce5237 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -177,9 +177,9 @@ private: this, "thor_preamble", {}, "List of preamble/header to be included in ThOr Functors"}; // Gaudi monitoring counters - mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr of processed events"}; - mutable std::vector< Gaudi::Accumulators::Counter<> > m_vec_nonempty_evt; - mutable std::vector< Gaudi::Accumulators::Counter<> > m_vec_multiple_cand_evt; + mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr of processed events"}; + mutable std::vector> m_vec_nonempty_evt; + mutable std::vector> m_vec_multiple_cand_evt; void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; @@ -560,8 +560,8 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c } std::string head = ptp.BranchName(); - m_vec_nonempty_evt.emplace_back(this, "nr of non empty events for branch "+head); - m_vec_multiple_cand_evt.emplace_back(this, "nr of events with multiple candidates for branch "+head); + m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); + m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); // find the MC decay finder.findDecay( input.begin(), input.end(), output ); @@ -650,8 +650,8 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con } std::string head = ptp.BranchName(); - m_vec_nonempty_evt.emplace_back(this, "nr of non empty events for branch "+head); - m_vec_multiple_cand_evt.emplace_back(this, "nr of events with multiple candidates for branch "+head); + m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); + m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); // find the decay finder.findDecay( input.begin(), input.end(), output ); @@ -909,11 +909,11 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb log << "No candidates found in this event. Skipping this event" << endmsg; return; } else if ( !p.empty() ) { - ++(m_vec_nonempty_evt[idx]); + ++( m_vec_nonempty_evt[idx] ); } if ( p.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - ++(m_vec_multiple_cand_evt[idx]); + ++( m_vec_multiple_cand_evt[idx] ); } return; } @@ -925,11 +925,11 @@ void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LH log << "No candidates found in this event. Skipping this event" << endmsg; return; } else if ( !p.empty() ) { - ++(m_vec_nonempty_evt[idx]); + ++( m_vec_nonempty_evt[idx] ); } if ( p.size() > 1 ) { log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - ++(m_vec_multiple_cand_evt[idx]); + ++( m_vec_multiple_cand_evt[idx] ); } return; } -- GitLab From 2181a2237e3970840a9e02f143d29b48ec2d8611 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Fri, 1 Oct 2021 08:47:42 +0000 Subject: [PATCH 19/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/16635965 --- Phys/FunTuple/src/FunTuple.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 84ce5237..97bf4c68 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -939,8 +939,8 @@ std::string FunTupleBase::parseVectorName( const std::string& branchname ) co std::string idxname = " "; std::string start_del = "["; std::string stop_del = "]"; - idxname = branchname.substr( branchname.find( start_del ) + start_del.length(), - branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); + idxname = branchname.substr( branchname.find( start_del ) + start_del.length(), + branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || idxname == branchname.substr( 0, branchname.find( stop_del ) ) { log << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; -- GitLab From 4fb3ccd60dca3c0cb92bb35d36ad5ebca6fd6365 Mon Sep 17 00:00:00 2001 From: mferrill Date: Fri, 1 Oct 2021 11:05:58 +0200 Subject: [PATCH 20/82] Fix typos --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 97bf4c68..b0b0bb39 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -942,7 +942,7 @@ std::string FunTupleBase::parseVectorName( const std::string& branchname ) co idxname = branchname.substr( branchname.find( start_del ) + start_del.length(), branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || - idxname == branchname.substr( 0, branchname.find( stop_del ) ) { + idxname == branchname.substr( 0, branchname.find( stop_del ) ) ) { log << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; idxname = "idx"; } -- GitLab From 37e13d92c7dfcb2ac5da0f77727a8b4d88fef75d Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Tue, 5 Oct 2021 14:16:38 +0200 Subject: [PATCH 21/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index b0b0bb39..f06bb04c 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -97,12 +97,7 @@ protected: StatusCode setParticleTupleProps(); StatusCode instantiate_loki(); StatusCode instantiate_thor(); - void FindAndBookTuple( const unsigned int& i, const T& particles, const Tuples::Tuple& ntuple ) const { - // variables used in explicit template specialisation, so suppress unused variable compiler warning here - (void)i; - (void)particles; - (void)ntuple; - } + void FindAndBookTuple( const unsigned int&, const T&, const Tuples::Tuple& ) const { } //(Will be removed): The following overloaded functions (makeMCTwoBodyDecay and makeTwoBodyDecay) are only used when // m_makeCustomData is set // to true (see m_makeCustomData property description for more info) -- GitLab From 01728806ef355f5799f378c872695479b84392d5 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 19 Oct 2021 19:01:40 +0200 Subject: [PATCH 22/82] Stable version of dynamic counters, addressing #16 --- .../python/FunTuple/FunTupleFunctions.py | 18 ++-- Phys/FunTuple/src/FunTuple.cpp | 95 ++++++++++++++----- 2 files changed, 83 insertions(+), 30 deletions(-) diff --git a/Phys/FunTuple/python/FunTuple/FunTupleFunctions.py b/Phys/FunTuple/python/FunTuple/FunTupleFunctions.py index 3ecb6984..04dab9b3 100644 --- a/Phys/FunTuple/python/FunTuple/FunTupleFunctions.py +++ b/Phys/FunTuple/python/FunTuple/FunTupleFunctions.py @@ -24,7 +24,8 @@ def FunTuple_Particles(name, loki_preamble=[], NTupleLUN='tuple', make_custom_data=False, - pyconf_alg=True): + pyconf_alg=True, + run_full_counter_mode=True): """ Wrapper function for FunTupleBase_Particles """ @@ -53,7 +54,8 @@ def FunTuple_Particles(name, thor_functor_branch_names=thor_functor_branch_names, make_custom_data=make_custom_data, loki_preamble=loki_preamble, - input_location=inputs) + input_location=inputs, + run_full_counter_mode=run_full_counter_mode) else: ftb = FunTupleBase_Particles_conf( name=name, @@ -67,7 +69,8 @@ def FunTuple_Particles(name, make_custom_data=make_custom_data, loki_preamble=loki_preamble, input_location=inputs, - NTupleLUN=NTupleLUN) + NTupleLUN=NTupleLUN, + run_full_counter_mode=run_full_counter_mode) return ftb @@ -81,7 +84,8 @@ def FunTuple_MCParticles(name, NTupleLUN='tuple', is_mctruth=True, make_custom_data=False, - pyconf_alg=True): + pyconf_alg=True, + run_full_counter_mode=True): """ Wrapper function for FunTupleBase_MCParticles """ @@ -111,7 +115,8 @@ def FunTuple_MCParticles(name, make_custom_data=make_custom_data, loki_preamble=loki_preamble, input_location=inputs, - is_mctruth=is_mctruth) + is_mctruth=is_mctruth, + run_full_counter_mode=run_full_counter_mode) else: ftb = FunTupleBase_MCParticles_conf( name=name, @@ -126,6 +131,7 @@ def FunTuple_MCParticles(name, loki_preamble=loki_preamble, input_location=inputs, is_mctruth=is_mctruth, - NTupleLUN=NTupleLUN) + NTupleLUN=NTupleLUN, + run_full_counter_mode=run_full_counter_mode) return ftb diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index f06bb04c..ac4cb945 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -45,6 +45,10 @@ // standard exception #include +// stdlib +#include +#include + // custom class #include "ParticleTupleProp.h" @@ -97,16 +101,19 @@ protected: StatusCode setParticleTupleProps(); StatusCode instantiate_loki(); StatusCode instantiate_thor(); - void FindAndBookTuple( const unsigned int&, const T&, const Tuples::Tuple& ) const { } + StatusCode instantiate_dynamic_counters(); // Instantiation of the elements of Gaudi counters deques + + void FindAndBookTuple( const unsigned int& i, const T& particles, const Tuples::Tuple& ntuple ) const {}; + //(Will be removed): The following overloaded functions (makeMCTwoBodyDecay and makeTwoBodyDecay) are only used when // m_makeCustomData is set // to true (see m_makeCustomData property description for more info) - void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, const int& parentid ) const; - void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, const int& parentid, - const int& prod1id, const int& prod2id, MsgStream& log ) const; - void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, const int& parentid ) const; - void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, const int& parentid, - const int& prod1id, const int& prod2id, MsgStream& log ) const; + void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid ) const; + void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid, + int prod1id, int prod2id, MsgStream& log ) const; + void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid ) const; + void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid, + int prod1id, int prod2id, MsgStream& log ) const; private: Gaudi::Property m_ntupleTname{this, "tree_name", "DecayTree", "Set TTree name"}; @@ -172,12 +179,18 @@ private: this, "thor_preamble", {}, "List of preamble/header to be included in ThOr Functors"}; // Gaudi monitoring counters - mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "nr of processed events"}; - mutable std::vector> m_vec_nonempty_evt; - mutable std::vector> m_vec_multiple_cand_evt; - + mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; + mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events (for each branch) + mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple candidate events (for each branch) + // Property to switch on/off the full counter mode (counter for each particle defined in branches) + Gaudi::Property m_full_counter_mode{this, "run_full_counter_mode", true, "Run the job in full counter mode"}; + //mutable std::mutex deque_Mutex; + + // Monitoring methods interacting with Gaudi counters void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; + + // Parsing method to identify the index name in tupling of arrays std::string parseVectorName( const std::string& branchname ) const; // make custom data @@ -231,6 +244,10 @@ StatusCode FunTupleBase::initialize() { StatusCode sc_func = instantiate_thor(); if ( sc_func.isFailure() ) { return this->Error( "Error in instantiating ThOr functors" ); } } + + StatusCode sc_dynamic_count = instantiate_dynamic_counters(); + if ( sc_dynamic_count.isFailure() ) { return this->Error( "Error in instantiating dynamic counters" ); } + // Initialise the max buffers size for arrays to be tupled m_maxSizeArray = 100; @@ -327,6 +344,28 @@ StatusCode FunTupleBase::instantiate_loki() { return StatusCode::SUCCESS; } +template +StatusCode FunTupleBase::instantiate_dynamic_counters() { + if ( m_full_counter_mode ) { + for ( unsigned int i = 0; i < m_branchnames_prefix.size(); ++i ) { + m_vec_nonempty_evt.emplace_back( this, "# non-empty events for branch " + m_branchnames_prefix[i] ); + m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for branch " + m_branchnames_prefix[i] ); + } + // check if vector counter size is the same as the branchname size + if ( (m_vec_nonempty_evt.size() != m_branchnames_prefix.size()) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix.size()) ) { + return this->Error( " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); + } + } else { + m_vec_nonempty_evt.emplace_back( this, "# non-empty events for first branch - " + m_branchnames_prefix[0] ); + m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for first branch - " + m_branchnames_prefix[0] ); + // check if vector counter size is the same as the branchname size + if ((m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size()) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix[0].size())) { + return this->Error( " Error (run_full_counter_mode=False): number of counters is not unitary" ); + } + } + return StatusCode::SUCCESS; +} + template StatusCode FunTupleBase::checks() { // check tuple name @@ -555,12 +594,16 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c } std::string head = ptp.BranchName(); - m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); - m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); + //m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); + //m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); // find the MC decay finder.findDecay( input.begin(), input.end(), output ); - monitorOutputMCParticle( i, output ); + if ( m_full_counter_mode ) { + monitorOutputMCParticle( i, output ); + } else { + if ( i == 0 ) monitorOutputMCParticle( i, output ); + } // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { @@ -645,12 +688,16 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con } std::string head = ptp.BranchName(); - m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); - m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); + //m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); + //m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); // find the decay finder.findDecay( input.begin(), input.end(), output ); - monitorOutputParticle( i, output ); + if ( m_full_counter_mode ) { + monitorOutputParticle( i, output ); + } else { + if ( i == 0 ) monitorOutputParticle( i, output ); + } // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { @@ -693,7 +740,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con // makeMCTwoBodyDecay property description for more info) template void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, - const int& parentid, const int& prod1id, const int& prod2id, + int parentid, int prod1id, int prod2id, MsgStream& log ) const { using std::sqrt; @@ -757,7 +804,7 @@ void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& // makeMCTwoBodyDecay property description for more info) template void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, - const int& parentid ) const { + int parentid ) const { // get 4-momenta const Gaudi::LorentzVector p1_4vec = p1.momentum(); const Gaudi::LorentzVector p2_4vec = p2.momentum(); @@ -798,8 +845,8 @@ void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& // This function is for testing purpose only and will be used only when m_makeCustomData is True, otherwise useless (see // makeTwoBodyDecay property description for more info) template -void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, const int& parentid, - const int& prod1id, const int& prod2id, MsgStream& log ) const { +void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid, + int prod1id, int prod2id, MsgStream& log ) const { using std::sqrt; // particle id of p1 and p2 @@ -865,7 +912,7 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L // makeTwoBodyDecay property description for more info) template void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, - const int& parentid ) const { + int parentid ) const { // set properties of p // particleid const LHCb::ParticleID p_id = LHCb::ParticleID( parentid ); // Jpsi @@ -899,7 +946,7 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream log = this->info(); - + //std::scoped_lock lock(deque_Mutex); if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; @@ -915,7 +962,7 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream log = this->info(); - + //std::scoped_lock lock(deque_Mutex); if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; -- GitLab From 644b9e12358043a587790a78f43472f43e1c8872 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Tue, 19 Oct 2021 17:02:03 +0000 Subject: [PATCH 23/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17014137 --- Phys/FunTuple/src/FunTuple.cpp | 54 +++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index ac4cb945..f59ad8c7 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -103,17 +103,17 @@ protected: StatusCode instantiate_thor(); StatusCode instantiate_dynamic_counters(); // Instantiation of the elements of Gaudi counters deques - void FindAndBookTuple( const unsigned int& i, const T& particles, const Tuples::Tuple& ntuple ) const {}; + void FindAndBookTuple( const unsigned int& i, const T& particles, const Tuples::Tuple& ntuple ) const {}; //(Will be removed): The following overloaded functions (makeMCTwoBodyDecay and makeTwoBodyDecay) are only used when // m_makeCustomData is set // to true (see m_makeCustomData property description for more info) void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid ) const; - void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid, - int prod1id, int prod2id, MsgStream& log ) const; + void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid, int prod1id, + int prod2id, MsgStream& log ) const; void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid ) const; - void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid, - int prod1id, int prod2id, MsgStream& log ) const; + void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid, int prod1id, + int prod2id, MsgStream& log ) const; private: Gaudi::Property m_ntupleTname{this, "tree_name", "DecayTree", "Set TTree name"}; @@ -180,15 +180,17 @@ private: // Gaudi monitoring counters mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; - mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events (for each branch) - mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple candidate events (for each branch) + mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events + // (for each branch) + mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple + // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) Gaudi::Property m_full_counter_mode{this, "run_full_counter_mode", true, "Run the job in full counter mode"}; - //mutable std::mutex deque_Mutex; + // mutable std::mutex deque_Mutex; // Monitoring methods interacting with Gaudi counters - void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; - void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; + void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; + void monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const; // Parsing method to identify the index name in tupling of arrays std::string parseVectorName( const std::string& branchname ) const; @@ -349,17 +351,22 @@ StatusCode FunTupleBase::instantiate_dynamic_counters() { if ( m_full_counter_mode ) { for ( unsigned int i = 0; i < m_branchnames_prefix.size(); ++i ) { m_vec_nonempty_evt.emplace_back( this, "# non-empty events for branch " + m_branchnames_prefix[i] ); - m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for branch " + m_branchnames_prefix[i] ); + m_vec_multiple_cand_evt.emplace_back( this, + "# events with multiple candidates for branch " + m_branchnames_prefix[i] ); } // check if vector counter size is the same as the branchname size - if ( (m_vec_nonempty_evt.size() != m_branchnames_prefix.size()) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix.size()) ) { - return this->Error( " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); + if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix.size() ) || + ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix.size() ) ) { + return this->Error( + " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); } } else { m_vec_nonempty_evt.emplace_back( this, "# non-empty events for first branch - " + m_branchnames_prefix[0] ); - m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for first branch - " + m_branchnames_prefix[0] ); + m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for first branch - " + + m_branchnames_prefix[0] ); // check if vector counter size is the same as the branchname size - if ((m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size()) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix[0].size())) { + if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size() ) || + ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix[0].size() ) ) { return this->Error( " Error (run_full_counter_mode=False): number of counters is not unitary" ); } } @@ -594,8 +601,8 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c } std::string head = ptp.BranchName(); - //m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); - //m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); + // m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); + // m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); // find the MC decay finder.findDecay( input.begin(), input.end(), output ); @@ -688,8 +695,8 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con } std::string head = ptp.BranchName(); - //m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); - //m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); + // m_vec_nonempty_evt.emplace_back( this, "nr of non empty events for branch " + head ); + // m_vec_multiple_cand_evt.emplace_back( this, "nr of events with multiple candidates for branch " + head ); // find the decay finder.findDecay( input.begin(), input.end(), output ); @@ -739,9 +746,8 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con // This function is for testing purpose only and will be used only when m_makeCustomData is True, otherwise useless (see // makeMCTwoBodyDecay property description for more info) template -void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, - int parentid, int prod1id, int prod2id, - MsgStream& log ) const { +void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid, + int prod1id, int prod2id, MsgStream& log ) const { using std::sqrt; // particle id of products @@ -946,7 +952,7 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream log = this->info(); - //std::scoped_lock lock(deque_Mutex); + // std::scoped_lock lock(deque_Mutex); if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; @@ -962,7 +968,7 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream log = this->info(); - //std::scoped_lock lock(deque_Mutex); + // std::scoped_lock lock(deque_Mutex); if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; -- GitLab From d36f1b8a0957ad34a498e4e408bd2e656f272395 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 19 Oct 2021 19:16:06 +0200 Subject: [PATCH 24/82] code cleanup --- Phys/FunTuple/src/FunTuple.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index f59ad8c7..30cb481d 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -186,7 +186,6 @@ private: // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) Gaudi::Property m_full_counter_mode{this, "run_full_counter_mode", true, "Run the job in full counter mode"}; - // mutable std::mutex deque_Mutex; // Monitoring methods interacting with Gaudi counters void monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const; -- GitLab From c0cd63ab3c03fa0e40cf894cb10fa67953354092 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 19 Oct 2021 19:17:13 +0200 Subject: [PATCH 25/82] code cleanup --- Phys/FunTuple/src/FunTuple.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 30cb481d..2dc7169a 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -951,7 +951,6 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream log = this->info(); - // std::scoped_lock lock(deque_Mutex); if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; @@ -967,7 +966,6 @@ void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream log = this->info(); - // std::scoped_lock lock(deque_Mutex); if ( p.empty() ) { log << "No candidates found in this event. Skipping this event" << endmsg; return; -- GitLab From a8363be855cd95ce2d29458012ccbe6299f32b37 Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 21 Oct 2021 11:30:07 +0200 Subject: [PATCH 26/82] Incorporate @pkoppenb comments on MsgStream and safety checks --- Phys/FunTuple/src/FunTuple.cpp | 49 +++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 2dc7169a..7b1a9d43 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -110,10 +110,10 @@ protected: // to true (see m_makeCustomData property description for more info) void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid ) const; void makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid, int prod1id, - int prod2id, MsgStream& log ) const; + int prod2id ) const; void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid ) const; void makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid, int prod1id, - int prod2id, MsgStream& log ) const; + int prod2id ) const; private: Gaudi::Property m_ntupleTname{this, "tree_name", "DecayTree", "Set TTree name"}; @@ -250,7 +250,7 @@ StatusCode FunTupleBase::initialize() { if ( sc_dynamic_count.isFailure() ) { return this->Error( "Error in instantiating dynamic counters" ); } // Initialise the max buffers size for arrays to be tupled - m_maxSizeArray = 100; + m_maxSizeArray = 10000; this->info() << "Finished initialisation: " << endmsg; @@ -522,6 +522,10 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( std::vector ) ) { std::string array_idxName = parseVectorName( colname ); + // TODO + if ( (std::any_cast< std::vector >( val )).size() > m_maxSizeArray ){ + this->err() << "The size of vector exceeds the max buffer size of 10000." << endmsg; + } return ntuple->farray( colname, std::any_cast const&>( val ), array_idxName, m_maxSizeArray ); } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ) { return ntuple->matrix( colname, std::any_cast( val ) ); @@ -587,8 +591,8 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c LHCb::MCParticle p = LHCb::MCParticle(); if ( m_makeCustomData ) { // set their properties of new particles - makeMCTwoBodyDecay( p1, p1_a, p1_b, 443, 13, -13, err ); // Jpis -> mu- mu+ - makeMCTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321, err ); // phi -> K+ K- + makeMCTwoBodyDecay( p1, p1_a, p1_b, 443, 13, -13 ); // Jpis -> mu- mu+ + makeMCTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321 ); // phi -> K+ K- makeMCTwoBodyDecay( p, p1, p2, 531 ); // Bs -> Jpsi phi input.push_back( &p ); } else { @@ -647,8 +651,9 @@ template <> void FunTupleBase::FindAndBookTuple( const unsigned int& i, const LHCb::Particles& particles, const Tuples::Tuple& ntuple ) const { // Messaging service - MsgStream log = this->info(); - MsgStream err = this->err(); + MsgStream log = this->info(); + MsgStream err = this->err(); + MsgStream debug = this->debug(); // check that correct functors related to Particles are loaded // TODO: MC Truth association with the reco particles needs to be handled @@ -680,10 +685,10 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con LHCb::Particle p2_b = LHCb::Particle(); LHCb::Particle p = LHCb::Particle(); if ( m_makeCustomData ) { - log << "Using dummy data" << endmsg; + if( this->msgLevel( MSG::DEBUG ) ) debug << "Using dummy data" << endmsg; // set their properties of new particles - makeTwoBodyDecay( p1, p1_a, p1_b, 443, 13, -13, err ); // Jpis -> mu- mu+ - makeTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321, err ); // phi -> K+ K- + makeTwoBodyDecay( p1, p1_a, p1_b, 443, 13, -13 ); // Jpis -> mu- mu+ + makeTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321); // phi -> K+ K- makeTwoBodyDecay( p, p1, p2, 531 ); // Bs -> Jpsi phi input.push_back( &p ); } else { @@ -746,7 +751,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con // makeMCTwoBodyDecay property description for more info) template void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& p1, LHCb::MCParticle& p2, int parentid, - int prod1id, int prod2id, MsgStream& log ) const { + int prod1id, int prod2id ) const { using std::sqrt; // particle id of products @@ -757,7 +762,7 @@ void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& // four momenta of products const LHCb::ParticleProperty* p1_prop = m_particlePropertySvc->find( p1_id ); const LHCb::ParticleProperty* p2_prop = m_particlePropertySvc->find( p2_id ); - if ( !p1_prop || !p2_prop ) { log << "Could not find either p1_prop or p2_prop" << endmsg; } + if ( !p1_prop || !p2_prop ) { this->Warning( "FunTuple::makeMCTwoBodyDecay: Could not find either p1_prop or p2_prop", StatusCode::SUCCESS).ignore(); } const double p1_mass = p1_prop->mass(); const double p2_mass = p2_prop->mass(); const Gaudi::XYZVector p1_3vec{10.2, 10.9, 30.2}; @@ -851,7 +856,7 @@ void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& // makeTwoBodyDecay property description for more info) template void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, LHCb::Particle& p2, int parentid, - int prod1id, int prod2id, MsgStream& log ) const { + int prod1id, int prod2id ) const { using std::sqrt; // particle id of p1 and p2 @@ -862,7 +867,7 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L // mass and four momenta of p1 and p2 const LHCb::ParticleProperty* p1_prop = m_particlePropertySvc->find( p1_id ); const LHCb::ParticleProperty* p2_prop = m_particlePropertySvc->find( p2_id ); - if ( !p1_prop || !p2_prop ) { log << "Could not find either p1_prop or p2_prop" << endmsg; } + if ( !p1_prop || !p2_prop ) { this->Warning( "FunTuple::makeTwoBodyDecay: Could not find either p1_prop or p2_prop", StatusCode::SUCCESS ).ignore(); } const double p1_mass = p1_prop->mass(); const double p2_mass = p2_prop->mass(); p1.setMeasuredMass( p1_mass ); @@ -950,37 +955,37 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L // Monitoring the size of the current event template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { - MsgStream log = this->info(); + MsgStream debug = this->debug(); if ( p.empty() ) { - log << "No candidates found in this event. Skipping this event" << endmsg; + this->Warning( "FunTuple::monitorOutputParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ).ignore(); return; } else if ( !p.empty() ) { ++( m_vec_nonempty_evt[idx] ); } if ( p.size() > 1 ) { - log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + if( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; ++( m_vec_multiple_cand_evt[idx] ); } return; } template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { - MsgStream log = this->info(); + MsgStream debug = this->debug(); if ( p.empty() ) { - log << "No candidates found in this event. Skipping this event" << endmsg; + this->Warning( "FunTuple::monitorOutputMCParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ).ignore(); return; } else if ( !p.empty() ) { ++( m_vec_nonempty_evt[idx] ); } if ( p.size() > 1 ) { - log << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + if( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; ++( m_vec_multiple_cand_evt[idx] ); } return; } template std::string FunTupleBase::parseVectorName( const std::string& branchname ) const { - MsgStream log = this->info(); + MsgStream debug = this->debug(); std::string idxname = " "; std::string start_del = "["; std::string stop_del = "]"; @@ -988,7 +993,7 @@ std::string FunTupleBase::parseVectorName( const std::string& branchname ) co branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || idxname == branchname.substr( 0, branchname.find( stop_del ) ) ) { - log << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; + if( this->msgLevel( MSG::DEBUG ) ) debug << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; idxname = "idx"; } return idxname; -- GitLab From 1bc0c74316bdd5ddda6f0030ccba4bcf3faa09b2 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Thu, 21 Oct 2021 09:31:03 +0000 Subject: [PATCH 27/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17051127 --- Phys/FunTuple/src/FunTuple.cpp | 39 +++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 7b1a9d43..ba7051b0 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -523,7 +523,7 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: } else if ( val.type() == typeid( std::vector ) ) { std::string array_idxName = parseVectorName( colname ); // TODO - if ( (std::any_cast< std::vector >( val )).size() > m_maxSizeArray ){ + if ( ( std::any_cast>( val ) ).size() > m_maxSizeArray ) { this->err() << "The size of vector exceeds the max buffer size of 10000." << endmsg; } return ntuple->farray( colname, std::any_cast const&>( val ), array_idxName, m_maxSizeArray ); @@ -593,7 +593,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c // set their properties of new particles makeMCTwoBodyDecay( p1, p1_a, p1_b, 443, 13, -13 ); // Jpis -> mu- mu+ makeMCTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321 ); // phi -> K+ K- - makeMCTwoBodyDecay( p, p1, p2, 531 ); // Bs -> Jpsi phi + makeMCTwoBodyDecay( p, p1, p2, 531 ); // Bs -> Jpsi phi input.push_back( &p ); } else { // fill the input vector from the input directly @@ -685,11 +685,11 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con LHCb::Particle p2_b = LHCb::Particle(); LHCb::Particle p = LHCb::Particle(); if ( m_makeCustomData ) { - if( this->msgLevel( MSG::DEBUG ) ) debug << "Using dummy data" << endmsg; + if ( this->msgLevel( MSG::DEBUG ) ) debug << "Using dummy data" << endmsg; // set their properties of new particles makeTwoBodyDecay( p1, p1_a, p1_b, 443, 13, -13 ); // Jpis -> mu- mu+ - makeTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321); // phi -> K+ K- - makeTwoBodyDecay( p, p1, p2, 531 ); // Bs -> Jpsi phi + makeTwoBodyDecay( p2, p2_a, p2_b, 333, 321, -321 ); // phi -> K+ K- + makeTwoBodyDecay( p, p1, p2, 531 ); // Bs -> Jpsi phi input.push_back( &p ); } else { for ( const auto& ip : particles ) { @@ -762,7 +762,10 @@ void FunTupleBase::makeMCTwoBodyDecay( LHCb::MCParticle& p, LHCb::MCParticle& // four momenta of products const LHCb::ParticleProperty* p1_prop = m_particlePropertySvc->find( p1_id ); const LHCb::ParticleProperty* p2_prop = m_particlePropertySvc->find( p2_id ); - if ( !p1_prop || !p2_prop ) { this->Warning( "FunTuple::makeMCTwoBodyDecay: Could not find either p1_prop or p2_prop", StatusCode::SUCCESS).ignore(); } + if ( !p1_prop || !p2_prop ) { + this->Warning( "FunTuple::makeMCTwoBodyDecay: Could not find either p1_prop or p2_prop", StatusCode::SUCCESS ) + .ignore(); + } const double p1_mass = p1_prop->mass(); const double p2_mass = p2_prop->mass(); const Gaudi::XYZVector p1_3vec{10.2, 10.9, 30.2}; @@ -867,7 +870,10 @@ void FunTupleBase::makeTwoBodyDecay( LHCb::Particle& p, LHCb::Particle& p1, L // mass and four momenta of p1 and p2 const LHCb::ParticleProperty* p1_prop = m_particlePropertySvc->find( p1_id ); const LHCb::ParticleProperty* p2_prop = m_particlePropertySvc->find( p2_id ); - if ( !p1_prop || !p2_prop ) { this->Warning( "FunTuple::makeTwoBodyDecay: Could not find either p1_prop or p2_prop", StatusCode::SUCCESS ).ignore(); } + if ( !p1_prop || !p2_prop ) { + this->Warning( "FunTuple::makeTwoBodyDecay: Could not find either p1_prop or p2_prop", StatusCode::SUCCESS ) + .ignore(); + } const double p1_mass = p1_prop->mass(); const double p2_mass = p2_prop->mass(); p1.setMeasuredMass( p1_mass ); @@ -957,13 +963,17 @@ template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { - this->Warning( "FunTuple::monitorOutputParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ).ignore(); + this->Warning( "FunTuple::monitorOutputParticle: No candidates found in this event. Skipping this event", + StatusCode::SUCCESS ) + .ignore(); return; } else if ( !p.empty() ) { ++( m_vec_nonempty_evt[idx] ); } if ( p.size() > 1 ) { - if( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + if ( this->msgLevel( MSG::DEBUG ) ) + debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." + << endmsg; ++( m_vec_multiple_cand_evt[idx] ); } return; @@ -972,13 +982,17 @@ template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { - this->Warning( "FunTuple::monitorOutputMCParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ).ignore(); + this->Warning( "FunTuple::monitorOutputMCParticle: No candidates found in this event. Skipping this event", + StatusCode::SUCCESS ) + .ignore(); return; } else if ( !p.empty() ) { ++( m_vec_nonempty_evt[idx] ); } if ( p.size() > 1 ) { - if( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; + if ( this->msgLevel( MSG::DEBUG ) ) + debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." + << endmsg; ++( m_vec_multiple_cand_evt[idx] ); } return; @@ -993,7 +1007,8 @@ std::string FunTupleBase::parseVectorName( const std::string& branchname ) co branchname.find( stop_del ) - ( branchname.find( start_del ) + start_del.length() ) ); if ( idxname == start_del || idxname == stop_del || idxname == "" || idxname == branchname || idxname == branchname.substr( 0, branchname.find( stop_del ) ) ) { - if( this->msgLevel( MSG::DEBUG ) ) debug << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; + if ( this->msgLevel( MSG::DEBUG ) ) + debug << "Could not assign a name to the array index. Default [idx] will be used." << endmsg; idxname = "idx"; } return idxname; -- GitLab From 14839a172cdaf773a6ca75a2655f32eb077486b6 Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 21 Oct 2021 12:01:15 +0200 Subject: [PATCH 28/82] include counter for events without candidate --- Phys/FunTuple/src/FunTuple.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index ba7051b0..46cc34d0 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -182,6 +182,8 @@ private: mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events // (for each branch) + mutable std::deque> m_vec_empty_evt; // container for counters of events with no candidate + // (for each branch) mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) @@ -350,21 +352,25 @@ StatusCode FunTupleBase::instantiate_dynamic_counters() { if ( m_full_counter_mode ) { for ( unsigned int i = 0; i < m_branchnames_prefix.size(); ++i ) { m_vec_nonempty_evt.emplace_back( this, "# non-empty events for branch " + m_branchnames_prefix[i] ); + m_vec_empty_evt.emplace_back( this, "# events without candidate for branch " + m_branchnames_prefix[i] ); m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for branch " + m_branchnames_prefix[i] ); } // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix.size() ) || + ( m_vec_empty_evt.size() != m_branchnames_prefix.size() ) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix.size() ) ) { return this->Error( " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); } } else { m_vec_nonempty_evt.emplace_back( this, "# non-empty events for first branch - " + m_branchnames_prefix[0] ); + m_vec_empty_evt.emplace_back( this, "# events without candidate for branch " + m_branchnames_prefix[0] ); m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for first branch - " + m_branchnames_prefix[0] ); // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size() ) || + ( m_vec_empty_evt.size() != m_branchnames_prefix[0].size() ) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix[0].size() ) ) { return this->Error( " Error (run_full_counter_mode=False): number of counters is not unitary" ); } @@ -615,6 +621,9 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c if ( i == 0 ) monitorOutputMCParticle( i, output ); } + // quit if current event has no candidate + if ( output.empty() ) return; + // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { for ( unsigned int j = 0; j < ( ptp.FunctorProps_loki() ).size(); j++ ) { @@ -710,6 +719,9 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con if ( i == 0 ) monitorOutputParticle( i, output ); } + // quit if current event has no candidate + if ( output.empty() ) return; + // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { for ( unsigned int j = 0; j < ( ptp.FunctorProps_loki() ).size(); j++ ) { @@ -963,6 +975,7 @@ template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { + ++( m_vec_empty_evt[idx] ); this->Warning( "FunTuple::monitorOutputParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ) .ignore(); @@ -982,6 +995,7 @@ template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { + ++( m_vec_empty_evt[idx] ); this->Warning( "FunTuple::monitorOutputMCParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ) .ignore(); -- GitLab From a0e854e1951e4359bae73fed0f92425820ab2237 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Thu, 21 Oct 2021 10:01:38 +0000 Subject: [PATCH 29/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17052187 --- Phys/FunTuple/src/FunTuple.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 46cc34d0..c0f94b21 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -182,8 +182,8 @@ private: mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events // (for each branch) - mutable std::deque> m_vec_empty_evt; // container for counters of events with no candidate - // (for each branch) + mutable std::deque> m_vec_empty_evt; // container for counters of events with no + // candidate (for each branch) mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) @@ -358,7 +358,7 @@ StatusCode FunTupleBase::instantiate_dynamic_counters() { } // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix.size() ) || - ( m_vec_empty_evt.size() != m_branchnames_prefix.size() ) || + ( m_vec_empty_evt.size() != m_branchnames_prefix.size() ) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix.size() ) ) { return this->Error( " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); @@ -370,7 +370,7 @@ StatusCode FunTupleBase::instantiate_dynamic_counters() { m_branchnames_prefix[0] ); // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size() ) || - ( m_vec_empty_evt.size() != m_branchnames_prefix[0].size() ) || + ( m_vec_empty_evt.size() != m_branchnames_prefix[0].size() ) || ( m_vec_multiple_cand_evt.size() != m_branchnames_prefix[0].size() ) ) { return this->Error( " Error (run_full_counter_mode=False): number of counters is not unitary" ); } @@ -622,7 +622,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, c } // quit if current event has no candidate - if ( output.empty() ) return; + if ( output.empty() ) return; // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { @@ -720,7 +720,7 @@ void FunTupleBase::FindAndBookTuple( const unsigned int& i, con } // quit if current event has no candidate - if ( output.empty() ) return; + if ( output.empty() ) return; // loop over FunctorProp to get individual functor outputs if ( !m_all_empty_lokifuncs ) { -- GitLab From cd6ab5fe5375ea6661a3c2cb2ffbd6fe15aa70b4 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Thu, 21 Oct 2021 10:02:28 +0000 Subject: [PATCH 30/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17052229 --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index c0f94b21..c5dab8d4 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -183,7 +183,7 @@ private: mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events // (for each branch) mutable std::deque> m_vec_empty_evt; // container for counters of events with no - // candidate (for each branch) + // candidate (for each branch) mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) -- GitLab From 03bb4e342af378438bbbf46c61d21a971f1ef04d Mon Sep 17 00:00:00 2001 From: mferrill Date: Thu, 21 Oct 2021 14:04:26 +0200 Subject: [PATCH 31/82] Move .gitignore modifications to separate MR --- .gitignore | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 9c15767c..f701b7eb 100644 --- a/.gitignore +++ b/.gitignore @@ -47,31 +47,4 @@ test_results/ i686-winxp-vc9-dbg/ .*-slc[56]-*.d/ .i686-winxp-vc9-dbg.d/ -.clang-format - -# Environment files (VSCode) -**/.vscode -.env - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pytest byproducts -.pytest_cache/ - -# QMTest byproducts -*.new -**/tests/qmtest/*.* -!**/tests/qmtest/*.qms -!**/tests/qmtest/*.qmt - -# Sphinx by-products -doc/_env* -doc/_build -doc/graphviz -doc/selection/thor_functors_reference.generated.rst - +.clang-format \ No newline at end of file -- GitLab From 8407826e156e69c06a9cddde9058493a9226ef61 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Tue, 9 Nov 2021 13:41:32 +0100 Subject: [PATCH 32/82] add FunTuple initialisation in the initialise method --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index c5dab8d4..1a491339 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -215,7 +215,7 @@ FunTupleBase::FunTupleBase( const std::string& name, ISvcLocator* pSvc ) template StatusCode FunTupleBase::initialize() { - + auto sc = LHCb::FTuple::Consumer::initialize(); this->info() << "Initialising the FunTupleBase algorithm" << endmsg; // check if all functors are empty -- GitLab From db4d65758909708ce2fa491fe4724446d2571a48 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Tue, 9 Nov 2021 13:42:18 +0100 Subject: [PATCH 33/82] adapt StatusCode in initalisation --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 1a491339..819aa2b4 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -224,7 +224,7 @@ StatusCode FunTupleBase::initialize() { // initialise consumer StatusCode sc_init = LHCb::FTuple::Consumer::initialize(); - if ( sc_init.isFailure() ) { return this->Error( "Error in initialisation of consumer" ); } + if ( sc_init.isFailure() ) { return sc_init; } // conduct checks to see if the parsed arguments are ok StatusCode sc_check = checks(); -- GitLab From 970d86c5594d7ae208d509401e6f989f6181dbe9 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Tue, 9 Nov 2021 13:42:49 +0100 Subject: [PATCH 34/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 819aa2b4..12c4da4e 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -228,7 +228,7 @@ StatusCode FunTupleBase::initialize() { // conduct checks to see if the parsed arguments are ok StatusCode sc_check = checks(); - if ( sc_check.isFailure() ) { return this->Error( "Error in checks" ); } + if ( sc_check.isFailure() ) { return sc_check; } // Using the arguments make a list of ParticleTupleProp objects that hold info on (TBranch name, Decay descriptor, // List of FunctorProp objects). The FunctorProp objects hold info on (functor name, functor TBranch name, functor -- GitLab From eda541af7b7d277306df16287d1b88607d1f4276 Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Tue, 9 Nov 2021 13:42:59 +0100 Subject: [PATCH 35/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 12c4da4e..fac48941 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -234,7 +234,7 @@ StatusCode FunTupleBase::initialize() { // List of FunctorProp objects). The FunctorProp objects hold info on (functor name, functor TBranch name, functor // return type (can handle precision but not used currently?)) StatusCode sc_ptp = setParticleTupleProps(); - if ( sc_ptp.isFailure() ) { return this->Error( "Error in setting ParticleTupleProps" ); } + if ( sc_ptp.isFailure() ) { return sc_ptp; } // Instantiate loKi the functors (unfortunately the FunctorProp objects could not hold the instantiated functors). if ( !m_all_empty_lokifuncs ) { -- GitLab From 0500c557f30eac460a9a160c5c56c0464f80d9fd Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Tue, 9 Nov 2021 13:46:35 +0100 Subject: [PATCH 36/82] Adapt msgstream priority from log() to verbose() --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index fac48941..4cd2423d 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -261,7 +261,7 @@ StatusCode FunTupleBase::initialize() { template <> StatusCode FunTupleBase::instantiate_thor() { - this->info() << "Instantiating ThOr functors!" << endmsg; + if (msgLevel(MSG::VERBOSE) this->verbose() << "Instantiating ThOr functors!" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_fun_thor.emplace_back(); -- GitLab From 032e10fbd37f0656521c7468a7b8567f395090b4 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 14:00:46 +0100 Subject: [PATCH 37/82] resolve threads on msgstream --- Phys/FunTuple/src/FunTuple.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 4cd2423d..1f91b123 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -255,13 +255,12 @@ StatusCode FunTupleBase::initialize() { m_maxSizeArray = 10000; this->info() << "Finished initialisation: " << endmsg; - return StatusCode::SUCCESS; } template <> StatusCode FunTupleBase::instantiate_thor() { - if (msgLevel(MSG::VERBOSE) this->verbose() << "Instantiating ThOr functors!" << endmsg; + if (msgLevel(MSG::VERBOSE)) this->verbose() << "Instantiating Particle ThOr functors" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_fun_thor.emplace_back(); @@ -276,13 +275,12 @@ StatusCode FunTupleBase::instantiate_thor() { m_factory_thor->get>( this, tfuncthor ) ); } } - return StatusCode::SUCCESS; } template <> StatusCode FunTupleBase::instantiate_thor() { - this->info() << "Instantiating ThOr functors!" << endmsg; + if (msgLevel(MSG::VERBOSE)) this->verbose() << "Instantiating MCParticle ThOr functors" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_mcfun_thor.emplace_back(); @@ -299,7 +297,6 @@ StatusCode FunTupleBase::instantiate_thor() { } // this->info() << "Size of funcs 2: " << m_mcfun_thor.size() << endmsg; - return StatusCode::SUCCESS; } @@ -343,7 +340,6 @@ StatusCode FunTupleBase::instantiate_loki() { m_fun_loki.push_back( imfunc ); } } - return StatusCode::SUCCESS; } -- GitLab From ed447f285c55e89a8f9f37f9ea1b31a89cc3b99b Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 14:42:58 +0100 Subject: [PATCH 38/82] Change msgstream in FunTuple initialisation --- Phys/FunTuple/src/FunTuple.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 1f91b123..7e1ead85 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -216,7 +216,7 @@ FunTupleBase::FunTupleBase( const std::string& name, ISvcLocator* pSvc ) template StatusCode FunTupleBase::initialize() { auto sc = LHCb::FTuple::Consumer::initialize(); - this->info() << "Initialising the FunTupleBase algorithm" << endmsg; + this->verbose() << "Initialising the FunTupleBase algorithm" << endmsg; // check if all functors are empty for ( const auto& mft : m_functors_loki ) { m_all_empty_lokifuncs = mft.empty() && m_all_empty_lokifuncs; } @@ -254,7 +254,7 @@ StatusCode FunTupleBase::initialize() { // Initialise the max buffers size for arrays to be tupled m_maxSizeArray = 10000; - this->info() << "Finished initialisation: " << endmsg; + this->verbose() << "Finished initialisation: " << endmsg; return StatusCode::SUCCESS; } -- GitLab From 976dfd8b63762afb313a2c16e00ec4135a46f675 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 14:53:38 +0100 Subject: [PATCH 39/82] pass by reference heavy objects in the tupling method --- Phys/FunTuple/src/FunTuple.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 7e1ead85..5d4a0274 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -519,15 +519,15 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: } else if ( val.type() == typeid( Gaudi::LorentzVector ) ) { return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( Gaudi::XYZVector ) ) { - return ntuple->column( colname, std::any_cast( val ) ); + return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( Gaudi::XYZPoint ) ) { - return ntuple->column( colname, std::any_cast( val ) ); + return ntuple->column( colname, std::any_cast( val ) ); } else if ( val.type() == typeid( std::vector ) ) { std::string array_idxName = parseVectorName( colname ); // TODO - if ( ( std::any_cast>( val ) ).size() > m_maxSizeArray ) { - this->err() << "The size of vector exceeds the max buffer size of 10000." << endmsg; - } + // if ( ( std::any_cast>( val ) ).size() > m_maxSizeArray ) { + // this->err() << "The size of vector exceeds the max buffer size of 10000." << endmsg; + // } return ntuple->farray( colname, std::any_cast const&>( val ), array_idxName, m_maxSizeArray ); } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ) { return ntuple->matrix( colname, std::any_cast( val ) ); -- GitLab From 7cc797bc82942b38ce7fca0edf8007693ca43dea Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Tue, 9 Nov 2021 13:54:06 +0000 Subject: [PATCH 40/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17468156 --- Phys/FunTuple/src/FunTuple.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 5d4a0274..6261a44b 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -215,7 +215,7 @@ FunTupleBase::FunTupleBase( const std::string& name, ISvcLocator* pSvc ) template StatusCode FunTupleBase::initialize() { - auto sc = LHCb::FTuple::Consumer::initialize(); + auto sc = LHCb::FTuple::Consumer::initialize(); this->verbose() << "Initialising the FunTupleBase algorithm" << endmsg; // check if all functors are empty @@ -260,7 +260,7 @@ StatusCode FunTupleBase::initialize() { template <> StatusCode FunTupleBase::instantiate_thor() { - if (msgLevel(MSG::VERBOSE)) this->verbose() << "Instantiating Particle ThOr functors" << endmsg; + if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Instantiating Particle ThOr functors" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_fun_thor.emplace_back(); @@ -280,7 +280,7 @@ StatusCode FunTupleBase::instantiate_thor() { template <> StatusCode FunTupleBase::instantiate_thor() { - if (msgLevel(MSG::VERBOSE)) this->verbose() << "Instantiating MCParticle ThOr functors" << endmsg; + if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Instantiating MCParticle ThOr functors" << endmsg; m_factory_thor.retrieve().ignore(); for ( auto& ptp : m_particletupleprops ) { m_mcfun_thor.emplace_back(); -- GitLab From f50d724d518accfc14e9815314eabc0c600a3815 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 16:20:57 +0100 Subject: [PATCH 41/82] change msgstream from info() to verbose() --- Phys/FunTuple/src/FunTuple.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 6261a44b..1c09abc3 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -304,7 +304,7 @@ template StatusCode FunTupleBase::instantiate_loki() { // Instantiate all the functors (unfortunately the FunctorProp objects created in the previous step could not hold // this information). - this->info() << "Instantiating LoKi functors!" << endmsg; + if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Instantiating LoKi functors" << endmsg; m_preamble_loki = boost::algorithm::join( m_preamble_def_loki.value(), "\n" ); for ( const auto& ptp : m_particletupleprops ) { std::vector imfunc_mc; @@ -393,7 +393,7 @@ StatusCode FunTupleBase::checks() { } if ( !m_all_empty_lokifuncs ) { - this->info() << "Conducting checks with LoKi " << endmsg; + if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Conducting checks with LoKi " << endmsg; // If the return types are not given set to a default (double), currently property not used anywhere, so does not // matter fill_returntypes( m_funcreturntypes_loki, m_funcbranchnames_suffix_loki, m_returntypes_loki ); @@ -406,7 +406,7 @@ StatusCode FunTupleBase::checks() { } if ( !m_all_empty_thorfuncs ) { - this->info() << "Conducting checks with ThOr " << endmsg; + if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Conducting checks with ThOr " << endmsg; // If the return types are not given set to a default (double), currently property not used anywhere, so does not // matter fill_returntypes( m_funcreturntypes_thor, m_funcbranchnames_suffix_thor, m_returntypes_thor ); @@ -463,7 +463,7 @@ void FunTupleBase::fill_returntypes( const LHCb::FTuple::VECT_VECT_STRINGS& f template StatusCode FunTupleBase::setParticleTupleProps() { // make a list of ParticleTupleProp objects to hold info related to particle being tupled - this->info() << "Setting the properties of ParticleTupleProp objects!" << endmsg; + if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Setting the properties of ParticleTupleProp objects" << endmsg; for ( unsigned int i = 0; i < m_branchnames_prefix.size(); i++ ) { ParticleTupleProp ptp = ParticleTupleProp(); ptp.setBranchName( m_branchnames_prefix[i] ); -- GitLab From 6ce8f26f0f37495c6018480c8980db12e8165994 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 16:41:21 +0100 Subject: [PATCH 42/82] fix compilation issue about msgstream --- Phys/FunTuple/src/FunTuple.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 1c09abc3..fc8a227f 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -393,7 +393,7 @@ StatusCode FunTupleBase::checks() { } if ( !m_all_empty_lokifuncs ) { - if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Conducting checks with LoKi " << endmsg; + if ( this->msgLevel( MSG::VERBOSE ) ) this->verbose() << "Conducting checks with LoKi " << endmsg; // If the return types are not given set to a default (double), currently property not used anywhere, so does not // matter fill_returntypes( m_funcreturntypes_loki, m_funcbranchnames_suffix_loki, m_returntypes_loki ); @@ -406,7 +406,7 @@ StatusCode FunTupleBase::checks() { } if ( !m_all_empty_thorfuncs ) { - if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Conducting checks with ThOr " << endmsg; + if ( this->msgLevel( MSG::VERBOSE ) ) this->verbose() << "Conducting checks with ThOr " << endmsg; // If the return types are not given set to a default (double), currently property not used anywhere, so does not // matter fill_returntypes( m_funcreturntypes_thor, m_funcbranchnames_suffix_thor, m_returntypes_thor ); @@ -525,9 +525,9 @@ StatusCode FunTupleBase::book_tuple( const Tuples::Tuple& ntuple, const std:: } else if ( val.type() == typeid( std::vector ) ) { std::string array_idxName = parseVectorName( colname ); // TODO - // if ( ( std::any_cast>( val ) ).size() > m_maxSizeArray ) { - // this->err() << "The size of vector exceeds the max buffer size of 10000." << endmsg; - // } + if ( ( std::any_cast>( val ) ).size() > m_maxSizeArray ) { + this->err() << "The size of vector exceeds the max buffer size of 10000." << endmsg; + } return ntuple->farray( colname, std::any_cast const&>( val ), array_idxName, m_maxSizeArray ); } else if ( val.type() == typeid( Gaudi::SymMatrix3x3 ) ) { return ntuple->matrix( colname, std::any_cast( val ) ); -- GitLab From f2078a59423dacfd44d4f0bbf8d5caf1a0241376 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 16:54:18 +0100 Subject: [PATCH 43/82] final fix msgstream --- Phys/FunTuple/src/FunTuple.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index fc8a227f..6f2e5806 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -304,7 +304,7 @@ template StatusCode FunTupleBase::instantiate_loki() { // Instantiate all the functors (unfortunately the FunctorProp objects created in the previous step could not hold // this information). - if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Instantiating LoKi functors" << endmsg; + if ( this->msgLevel( MSG::VERBOSE ) ) this->verbose() << "Instantiating LoKi functors" << endmsg; m_preamble_loki = boost::algorithm::join( m_preamble_def_loki.value(), "\n" ); for ( const auto& ptp : m_particletupleprops ) { std::vector imfunc_mc; @@ -463,7 +463,7 @@ void FunTupleBase::fill_returntypes( const LHCb::FTuple::VECT_VECT_STRINGS& f template StatusCode FunTupleBase::setParticleTupleProps() { // make a list of ParticleTupleProp objects to hold info related to particle being tupled - if ( msgLevel( MSG::VERBOSE ) ) this->verbose() << "Setting the properties of ParticleTupleProp objects" << endmsg; + if ( this->msgLevel( MSG::VERBOSE ) ) this->verbose() << "Setting the properties of ParticleTupleProp objects" << endmsg; for ( unsigned int i = 0; i < m_branchnames_prefix.size(); i++ ) { ParticleTupleProp ptp = ParticleTupleProp(); ptp.setBranchName( m_branchnames_prefix[i] ); -- GitLab From 8e71879d3e4e31a4ac031344e4a540ac4ed45cf6 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Tue, 9 Nov 2021 15:54:48 +0000 Subject: [PATCH 44/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17475856 --- Phys/FunTuple/src/FunTuple.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 6f2e5806..f50c469c 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -463,7 +463,8 @@ void FunTupleBase::fill_returntypes( const LHCb::FTuple::VECT_VECT_STRINGS& f template StatusCode FunTupleBase::setParticleTupleProps() { // make a list of ParticleTupleProp objects to hold info related to particle being tupled - if ( this->msgLevel( MSG::VERBOSE ) ) this->verbose() << "Setting the properties of ParticleTupleProp objects" << endmsg; + if ( this->msgLevel( MSG::VERBOSE ) ) + this->verbose() << "Setting the properties of ParticleTupleProp objects" << endmsg; for ( unsigned int i = 0; i < m_branchnames_prefix.size(); i++ ) { ParticleTupleProp ptp = ParticleTupleProp(); ptp.setBranchName( m_branchnames_prefix[i] ); -- GitLab From d8c807d01d74b17fc4350748c14a023d923d79a2 Mon Sep 17 00:00:00 2001 From: mferrill Date: Tue, 9 Nov 2021 17:08:01 +0100 Subject: [PATCH 45/82] import cleanup --- Phys/FunTuple/src/FunTuple.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index f50c469c..adb8229c 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -42,9 +42,6 @@ // boost #include -// standard exception -#include - // stdlib #include #include -- GitLab From 0930e721c2b3ae0bcb678d287fbc9457d2715206 Mon Sep 17 00:00:00 2001 From: mferrill Date: Wed, 10 Nov 2021 10:23:42 +0100 Subject: [PATCH 46/82] fix warnings in integration tests --- Phys/FunTuple/src/FunTuple.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index adb8229c..adc9c7dc 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -100,7 +100,7 @@ protected: StatusCode instantiate_thor(); StatusCode instantiate_dynamic_counters(); // Instantiation of the elements of Gaudi counters deques - void FindAndBookTuple( const unsigned int& i, const T& particles, const Tuples::Tuple& ntuple ) const {}; + void FindAndBookTuple( const unsigned int& i, const T& particles, const Tuples::Tuple& ntuple ) const; //(Will be removed): The following overloaded functions (makeMCTwoBodyDecay and makeTwoBodyDecay) are only used when // m_makeCustomData is set @@ -212,17 +212,15 @@ FunTupleBase::FunTupleBase( const std::string& name, ISvcLocator* pSvc ) template StatusCode FunTupleBase::initialize() { - auto sc = LHCb::FTuple::Consumer::initialize(); + // initialise consumer this->verbose() << "Initialising the FunTupleBase algorithm" << endmsg; + StatusCode sc_init = LHCb::FTuple::Consumer::initialize(); + if ( sc_init.isFailure() ) { return sc_init; } // check if all functors are empty for ( const auto& mft : m_functors_loki ) { m_all_empty_lokifuncs = mft.empty() && m_all_empty_lokifuncs; } for ( const auto& mft : m_functors_thor ) { m_all_empty_thorfuncs = mft.empty() && m_all_empty_thorfuncs; } - // initialise consumer - StatusCode sc_init = LHCb::FTuple::Consumer::initialize(); - if ( sc_init.isFailure() ) { return sc_init; } - // conduct checks to see if the parsed arguments are ok StatusCode sc_check = checks(); if ( sc_check.isFailure() ) { return sc_check; } -- GitLab From 3d52ba8e49c969bd51a7491b7672bffc2d7329da Mon Sep 17 00:00:00 2001 From: Gerhard Raven Date: Wed, 17 Nov 2021 10:29:15 +0100 Subject: [PATCH 47/82] Apply 1 suggestion(s) to 1 file(s) --- Phys/FunTuple/src/FunTuple.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index adc9c7dc..e5dfa65c 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -244,7 +244,7 @@ StatusCode FunTupleBase::initialize() { } StatusCode sc_dynamic_count = instantiate_dynamic_counters(); - if ( sc_dynamic_count.isFailure() ) { return this->Error( "Error in instantiating dynamic counters" ); } + if ( sc_dynamic_count.isFailure() ) { return sc_dynamic_count; } // Initialise the max buffers size for arrays to be tupled m_maxSizeArray = 10000; -- GitLab From 3ae0708d986d2ec405785c094bde6bd0fa4d7433 Mon Sep 17 00:00:00 2001 From: mferrill Date: Wed, 17 Nov 2021 13:01:02 +0100 Subject: [PATCH 48/82] Wrapping SynchronizedValue around dynamic counters --- Phys/FunTuple/src/FunTuple.cpp | 35 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index e5dfa65c..1a31dcdc 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -38,13 +38,13 @@ #include "Kernel/IParticlePropertySvc.h" #include "Kernel/ParticleID.h" #include "Kernel/ParticleProperty.h" +#include "Kernel/SynchronizedValue.h" // boost #include // stdlib #include -#include // custom class #include "ParticleTupleProp.h" @@ -177,11 +177,11 @@ private: // Gaudi monitoring counters mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; - mutable std::deque> m_vec_nonempty_evt; // container for counters of non empty events + mutable LHCb::cxx::SynchronizedValue>> m_vec_nonempty_evt; // container for counters of non empty events // (for each branch) - mutable std::deque> m_vec_empty_evt; // container for counters of events with no + mutable LHCb::cxx::SynchronizedValue>> m_vec_empty_evt; // container for counters of events with no // candidate (for each branch) - mutable std::deque> m_vec_multiple_cand_evt; // container for counters of multiple + mutable LHCb::cxx::SynchronizedValue>> m_vec_multiple_cand_evt; // container for counters of multiple // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) Gaudi::Property m_full_counter_mode{this, "run_full_counter_mode", true, "Run the job in full counter mode"}; @@ -342,10 +342,9 @@ template StatusCode FunTupleBase::instantiate_dynamic_counters() { if ( m_full_counter_mode ) { for ( unsigned int i = 0; i < m_branchnames_prefix.size(); ++i ) { - m_vec_nonempty_evt.emplace_back( this, "# non-empty events for branch " + m_branchnames_prefix[i] ); - m_vec_empty_evt.emplace_back( this, "# events without candidate for branch " + m_branchnames_prefix[i] ); - m_vec_multiple_cand_evt.emplace_back( this, - "# events with multiple candidates for branch " + m_branchnames_prefix[i] ); + m_vec_nonempty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# non-empty events for branch " + m_branchnames_prefix[i]) } ); + m_vec_empty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# events without candidate for branch " + m_branchnames_prefix[i]) } ); + m_vec_multiple_cand_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# events with multiple candidates for branch "+ m_branchnames_prefix[i]) } ); } // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix.size() ) || @@ -355,10 +354,10 @@ StatusCode FunTupleBase::instantiate_dynamic_counters() { " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); } } else { - m_vec_nonempty_evt.emplace_back( this, "# non-empty events for first branch - " + m_branchnames_prefix[0] ); - m_vec_empty_evt.emplace_back( this, "# events without candidate for branch " + m_branchnames_prefix[0] ); - m_vec_multiple_cand_evt.emplace_back( this, "# events with multiple candidates for first branch - " + - m_branchnames_prefix[0] ); + m_vec_nonempty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# non-empty events for first branch - "+m_branchnames_prefix[0] ) } ); + m_vec_empty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this,"# events without candidate for branch "+m_branchnames_prefix[0]) } ); + m_vec_multiple_cand_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# events with multiple candidates for first branch - "+m_branchnames_prefix[0]) } ); + // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size() ) || ( m_vec_empty_evt.size() != m_branchnames_prefix[0].size() ) || @@ -967,19 +966,19 @@ template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { - ++( m_vec_empty_evt[idx] ); + m_vec_empty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); this->Warning( "FunTuple::monitorOutputParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ) .ignore(); return; } else if ( !p.empty() ) { - ++( m_vec_nonempty_evt[idx] ); + m_vec_nonempty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); } if ( p.size() > 1 ) { if ( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - ++( m_vec_multiple_cand_evt[idx] ); + m_vec_multiple_cand_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); } return; } @@ -987,19 +986,19 @@ template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { - ++( m_vec_empty_evt[idx] ); + m_vec_empty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); this->Warning( "FunTuple::monitorOutputMCParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ) .ignore(); return; } else if ( !p.empty() ) { - ++( m_vec_nonempty_evt[idx] ); + m_vec_nonempty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); } if ( p.size() > 1 ) { if ( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - ++( m_vec_multiple_cand_evt[idx] ); + m_vec_multiple_cand_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); } return; } -- GitLab From 4480904ceeaf707f26d51f6efdcda8d5884bcb8c Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Wed, 17 Nov 2021 12:01:36 +0000 Subject: [PATCH 49/82] Fixed formatting patch generated by https://gitlab.cern.ch/lhcb/Analysis/-/jobs/17667578 --- Phys/FunTuple/src/FunTuple.cpp | 59 +++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/Phys/FunTuple/src/FunTuple.cpp b/Phys/FunTuple/src/FunTuple.cpp index 1a31dcdc..a83816a6 100755 --- a/Phys/FunTuple/src/FunTuple.cpp +++ b/Phys/FunTuple/src/FunTuple.cpp @@ -176,13 +176,20 @@ private: this, "thor_preamble", {}, "List of preamble/header to be included in ThOr Functors"}; // Gaudi monitoring counters - mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; - mutable LHCb::cxx::SynchronizedValue>> m_vec_nonempty_evt; // container for counters of non empty events - // (for each branch) - mutable LHCb::cxx::SynchronizedValue>> m_vec_empty_evt; // container for counters of events with no - // candidate (for each branch) - mutable LHCb::cxx::SynchronizedValue>> m_vec_multiple_cand_evt; // container for counters of multiple - // candidate events (for each branch) + mutable Gaudi::Accumulators::Counter<> m_processed_evt{this, "# processed events"}; + mutable LHCb::cxx::SynchronizedValue>> m_vec_nonempty_evt; // container for + // counters of + // non empty + // events (for + // each branch) + mutable LHCb::cxx::SynchronizedValue>> m_vec_empty_evt; // container for + // counters of + // events with no + // candidate (for + // each branch) + mutable LHCb::cxx::SynchronizedValue>> + m_vec_multiple_cand_evt; // container for counters of multiple + // candidate events (for each branch) // Property to switch on/off the full counter mode (counter for each particle defined in branches) Gaudi::Property m_full_counter_mode{this, "run_full_counter_mode", true, "Run the job in full counter mode"}; @@ -342,9 +349,15 @@ template StatusCode FunTupleBase::instantiate_dynamic_counters() { if ( m_full_counter_mode ) { for ( unsigned int i = 0; i < m_branchnames_prefix.size(); ++i ) { - m_vec_nonempty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# non-empty events for branch " + m_branchnames_prefix[i]) } ); - m_vec_empty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# events without candidate for branch " + m_branchnames_prefix[i]) } ); - m_vec_multiple_cand_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# events with multiple candidates for branch "+ m_branchnames_prefix[i]) } ); + m_vec_nonempty_evt.with_lock( [&i]( std::deque>& counter ) { + counter.emplace_back( this, "# non-empty events for branch " + m_branchnames_prefix[i] ) + } ); + m_vec_empty_evt.with_lock( [&i]( std::deque>& counter ) { + counter.emplace_back( this, "# events without candidate for branch " + m_branchnames_prefix[i] ) + } ); + m_vec_multiple_cand_evt.with_lock( [&i]( std::deque>& counter ) { + counter.emplace_back( this, "# events with multiple candidates for branch " + m_branchnames_prefix[i] ) + } ); } // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix.size() ) || @@ -354,9 +367,15 @@ StatusCode FunTupleBase::instantiate_dynamic_counters() { " Error (run_full_counter_mode=True): size of branch names and number of counters do not match" ); } } else { - m_vec_nonempty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# non-empty events for first branch - "+m_branchnames_prefix[0] ) } ); - m_vec_empty_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this,"# events without candidate for branch "+m_branchnames_prefix[0]) } ); - m_vec_multiple_cand_evt.with_lock( [&i](std::deque>& counter) { counter.emplace_back(this, "# events with multiple candidates for first branch - "+m_branchnames_prefix[0]) } ); + m_vec_nonempty_evt.with_lock( [&i]( std::deque>& counter ) { + counter.emplace_back( this, "# non-empty events for first branch - " + m_branchnames_prefix[0] ) + } ); + m_vec_empty_evt.with_lock( [&i]( std::deque>& counter ) { + counter.emplace_back( this, "# events without candidate for branch " + m_branchnames_prefix[0] ) + } ); + m_vec_multiple_cand_evt.with_lock( [&i]( std::deque>& counter ) { + counter.emplace_back( this, "# events with multiple candidates for first branch - " + m_branchnames_prefix[0] ) + } ); // check if vector counter size is the same as the branchname size if ( ( m_vec_nonempty_evt.size() != m_branchnames_prefix[0].size() ) || @@ -966,19 +985,20 @@ template void FunTupleBase::monitorOutputParticle( const unsigned int& idx, const LHCb::Particle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { - m_vec_empty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); + m_vec_empty_evt.with_lock( [&idx]( std::deque>& counter ) { ++counter[idx]; } ); this->Warning( "FunTuple::monitorOutputParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ) .ignore(); return; } else if ( !p.empty() ) { - m_vec_nonempty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); + m_vec_nonempty_evt.with_lock( [&idx]( std::deque>& counter ) { ++counter[idx]; } ); } if ( p.size() > 1 ) { if ( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - m_vec_multiple_cand_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); + m_vec_multiple_cand_evt.with_lock( + [&idx]( std::deque>& counter ) { ++counter[idx]; } ); } return; } @@ -986,19 +1006,20 @@ template void FunTupleBase::monitorOutputMCParticle( const unsigned int& idx, const LHCb::MCParticle::ConstVector& p ) const { MsgStream debug = this->debug(); if ( p.empty() ) { - m_vec_empty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); + m_vec_empty_evt.with_lock( [&idx]( std::deque>& counter ) { ++counter[idx]; } ); this->Warning( "FunTuple::monitorOutputMCParticle: No candidates found in this event. Skipping this event", StatusCode::SUCCESS ) .ignore(); return; } else if ( !p.empty() ) { - m_vec_nonempty_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); + m_vec_nonempty_evt.with_lock( [&idx]( std::deque>& counter ) { ++counter[idx]; } ); } if ( p.size() > 1 ) { if ( this->msgLevel( MSG::DEBUG ) ) debug << "Multiple particles match the decay descriptor. All candidates info will be stored with a suffix." << endmsg; - m_vec_multiple_cand_evt.with_lock( [&idx](std::deque>& counter) { ++counter[idx]; } ); + m_vec_multiple_cand_evt.with_lock( + [&idx]( std::deque>& counter ) { ++counter[idx]; } ); } return; } -- GitLab From fb2c4443babbc2807823c782d1b34be756ee3f61 Mon Sep 17 00:00:00 2001 From: Murilo Santana Rangel Date: Thu, 16 Sep 2021 15:33:41 +0200 Subject: [PATCH 50/82] Adding JetAccessoriesMC for MCjet reconstruction --- .../src/TupleToolJetInfo.cpp | 856 ++++++++++++++++++ .../DecayTreeTupleJets/src/TupleToolJetInfo.h | 94 ++ .../src/TupleToolMC2Jet.cpp | 752 +++++++++++++++ Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.h | 97 ++ Phys/JetAccessoriesMC/CMakeLists.txt | 29 + Phys/JetAccessoriesMC/src/McJetBuilder.cpp | 166 ++++ Phys/JetAccessoriesMC/src/McJetBuilder.h | 118 +++ Phys/JetAccessoriesMC/src/McParticleFlow.cpp | 245 +++++ Phys/JetAccessoriesMC/src/McParticleFlow.h | 121 +++ 9 files changed, 2478 insertions(+) create mode 100644 Phys/DecayTreeTupleJets/src/TupleToolJetInfo.cpp create mode 100644 Phys/DecayTreeTupleJets/src/TupleToolJetInfo.h create mode 100644 Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.cpp create mode 100644 Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.h create mode 100644 Phys/JetAccessoriesMC/CMakeLists.txt create mode 100644 Phys/JetAccessoriesMC/src/McJetBuilder.cpp create mode 100644 Phys/JetAccessoriesMC/src/McJetBuilder.h create mode 100644 Phys/JetAccessoriesMC/src/McParticleFlow.cpp create mode 100644 Phys/JetAccessoriesMC/src/McParticleFlow.h diff --git a/Phys/DecayTreeTupleJets/src/TupleToolJetInfo.cpp b/Phys/DecayTreeTupleJets/src/TupleToolJetInfo.cpp new file mode 100644 index 00000000..34ccfde5 --- /dev/null +++ b/Phys/DecayTreeTupleJets/src/TupleToolJetInfo.cpp @@ -0,0 +1,856 @@ +/*****************************************************************************\ +* (c) Copyright 2020 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. * +\*****************************************************************************/ +// $Id: TupleToolJetInfo.cpp,v 1.2 2010-01-26 15:48:57 rlambert Exp $ +// Include files +#include "Event/Particle.h" +#include "GaudiKernel/ToolFactory.h" +// kernel +#include "GaudiAlg/Tuple.h" +#include "GaudiAlg/TupleObj.h" +#include "GaudiKernel/PhysicalConstants.h" +#include +#include +// Will +#include "Kernel/IJetMaker.h" + +// Will for event info: + +#include "Event/ODIN.h" // event & run number +#include "LoKi/ParticleContextCuts.h" +#include "LoKi/ParticleCuts.h" +#include "LoKi/PhysTypes.h" +#include "LoKi/VertexCuts.h" + +#include "Kernel/JetEnums.h" + +// local +#include "TupleToolJetInfo.h" +#include +//----------------------------------------------------------------------------- +// Implementation file for class : TupleToolJetInfo +// +//----------------------------------------------------------------------------- + +using namespace Gaudi; // for event etc... +using namespace LHCb; + +// Declaration of the Algorithm Factory +DECLARE_COMPONENT( TupleToolJetInfo ) +//============================================================================= +// Standard constructor, initializes variables +//============================================================================= +TupleToolJetInfo::TupleToolJetInfo( const std::string& type, const std::string& name, const IInterface* parent ) + : TupleToolBase( type, name, parent ) + , m_dva( 0 ) + +{ + declareInterface( this ); + declareProperty( "JetLocation", m_jetlocation = "Phys/StdPFJets/Particles" ); + declareProperty( "MCJetLocation", m_mcjetlocation = "Phys/TrueJets/Particles" ); + declareProperty( "NoIDJetLocation", m_noidjetlocation = "Phys/StdPFJets/Particles" ); + declareProperty( "JetPrefix", m_jetprefix = "" ); + declareProperty( "FillSigJet", m_fillsigjet = false ); + declareProperty( "nJets", m_njets = 1 ); + declareProperty( "DeltaR", m_deltaR = 0.5 ); + declareProperty( "ApplyTag", m_applytag = false, "Filter jets according to the main tagger specified" ); + declareProperty( "FillTag", m_tag = false, "Fill tagging information for main tagger and extra taggers" ); + declareProperty( "JetTagger", m_jettaggername = "LoKi::BDTTag" ); + declareProperty( "ExtraJetTaggers", m_jettaggernames ); + declareProperty( "JetEtaRange", m_jetetarange ); // if empty, initialised to 2, 4.5 below + declareProperty( "MultPts", m_multpts ); // if empty, initialised to [10] below + declareProperty( "MC", m_mc = false ); + declareProperty( "FillFlavour", m_flavourvars = false ); + declareProperty( "SamePV", m_samepv = true ); + declareProperty( "TagByParton", m_tagbyparton = true, + "Perform the tagging using partons instead of default (hadrons)" ); +} +//============================================================================= +// Destructor +//============================================================================= +TupleToolJetInfo::~TupleToolJetInfo() {} + +//============================================================================= +// Initialization +//============================================================================= +StatusCode TupleToolJetInfo::initialize() { + StatusCode sc = TupleToolBase::initialize(); + if ( sc.isFailure() ) return sc; + + if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; + + m_dva = Gaudi::Utils::getIDVAlgorithm( contextSvc(), this ); + if ( !m_dva ) return Error( "Couldn't get parent DVAlgorithm" ); + + m_dist = m_dva->distanceCalculator(); + + if ( m_applytag || m_tag ) { m_jetTagger = tool( m_jettaggername, this ); } + if ( m_filltag ) { + for ( unsigned int i = 0; i < m_jettaggernames.size(); ++i ) + m_jetTaggers.push_back( tool( m_jettaggernames.at( i ), this ) ); + } + + if ( m_jetetarange.size() == 0 ) { + m_jetetarange.push_back( 2.0 ); + m_jetetarange.push_back( 4.5 ); + } + if ( m_multpts.size() == 0 ) { m_multpts.push_back( 20000 ); } + + return StatusCode::SUCCESS; +} + +//============================================================================= +// Fill the tuple +//============================================================================= + +StatusCode TupleToolJetInfo::fill( const LHCb::Particle* top, const LHCb::Particle* part, const std::string& head, + Tuples::Tuple& tuple ) { + + // Get true jets + LHCb::MCParticles* PFtruthjets = 0; + + if ( m_mc ) { PFtruthjets = get( m_mcjetlocation ); } + + m_mcparts = 0; + + if ( m_mc ) { + if ( exist( LHCb::MCParticleLocation::Default ) ) { + m_mcparts = getIfExists( LHCb::MCParticleLocation::Default ); + } else { + error() << "Cannot find MC Particle Container" << endmsg; + } + } + + std::vector dtree = getdecaytree( top ); + + std::vector truthjets; + std::vector alltruthjets; // no eta cut + if ( m_mc ) { + for ( LHCb::MCParticles::const_iterator ij = PFtruthjets->begin(); ij != PFtruthjets->end(); ++ij ) { + bool deltaR = delta_r( ( *ij ), dtree ) > m_deltaR; + bool eta = ( *ij )->momentum().eta() > m_jetetarange[0] && ( *ij )->momentum().eta() < m_jetetarange[1]; + if ( deltaR && eta ) { truthjets.push_back( *ij ); } + // note this cut if fake rate increases (23/11/15)! + // if ( deltaR ) { + alltruthjets.push_back( *ij ); + //} + } + } + + std::sort( truthjets.begin(), truthjets.end(), pred() ); + std::sort( alltruthjets.begin(), alltruthjets.end(), pred() ); + + // Just fill if part is a jet + if ( part->particleID().pid() == 98 ) { + fillJet( part, head, tuple ); + if ( m_mc ) { + const LHCb::MCParticle* truejet = jet_deltar_truthmatch( part, alltruthjets ); + fillTrueJet( part, truejet, head, tuple ); + } + return StatusCode::SUCCESS; + } + + LHCb::Particles *PFjets = 0, *PFNoIDjets = 0; + + PFjets = get( m_jetlocation ); + + if ( m_fillsigjet ) { + if ( m_noidjetlocation == m_jetlocation ) { + PFNoIDjets = PFjets; + } else { + PFNoIDjets = get( m_noidjetlocation ); + } + } + bool test = true; + const std::string prefix = fullName( head ); + if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Fill" << endmsg; + + // Filter into those that in the pseudorapidity range required + // and have the requisite delta R from any particle in the decay chain + // and share the same primary vertex + + Gaudi::XYZPoint vtx; + if ( top->endVertex() ) + vtx = top->endVertex()->position(); + else { + const LHCb::VertexBase* vtx_base = m_dva->bestVertex( part ); + if ( vtx_base ) vtx = vtx_base->position(); + } + + double z_vertex_x = vtx.X(); + double z_vertex_y = vtx.Y(); + double z_vertex_z = vtx.Z(); + + std::vector jets; + std::vector noidjets; + + for ( LHCb::Particles::const_iterator ij = PFjets->begin(); ij != PFjets->end(); ++ij ) { + bool deltaR = delta_r( ( *ij ), dtree ) > m_deltaR; + bool eta = ( *ij )->momentum().eta() > m_jetetarange[0] && ( *ij )->momentum().eta() < m_jetetarange[1]; + + bool samepv = true; + + const LHCb::Vertex* jet_vertex = ( *ij )->endVertex(); + + if ( jet_vertex && m_samepv ) { + double jet_vertex_x = jet_vertex->position().X(); + double jet_vertex_y = jet_vertex->position().Y(); + double jet_vertex_z = jet_vertex->position().Z(); + double minDistance = sqrt( ( z_vertex_x - jet_vertex_x ) * ( z_vertex_x - jet_vertex_x ) + + ( z_vertex_y - jet_vertex_y ) * ( z_vertex_y - jet_vertex_y ) + + ( z_vertex_z - jet_vertex_z ) * ( z_vertex_z - jet_vertex_z ) ); + samepv = ( minDistance < 1 ); + } + + // only check on tag if we've specified it + bool pass_tag = true; + if ( m_applytag ) { + std::map jetWeights; + m_jetTagger->calculateJetProperty( ( *ij ), jetWeights ); + pass_tag = jetWeights["Tag"]; + } + + if ( deltaR && eta && samepv && pass_tag ) jets.push_back( *ij ); + } + + std::sort( jets.begin(), jets.end(), pred() ); + + if ( m_fillsigjet ) { + + if ( m_noidjetlocation == m_jetlocation ) { + noidjets = jets; + } else { + for ( LHCb::Particles::const_iterator ij = PFNoIDjets->begin(); ij != PFNoIDjets->end(); ++ij ) { + bool injet = false; + injet = partinjet( ( *ij ), part ); // no need for eta cut! + if ( injet ) noidjets.push_back( *ij ); + } + } + std::sort( noidjets.begin(), noidjets.end(), pred() ); + } + // Now let's fill some stuff + for ( int i = 0; i < m_njets; ++i ) { + // -- Convert jet number to a string + char jetNumber[4]; + sprintf( jetNumber, "%i", i ); + std::string jetidx( jetNumber ); + if ( (int)jets.size() > i ) { + fillJet( jets[i], head, tuple, i == 0 ? m_jetprefix + "jet" : m_jetprefix + "jet" + jetidx ); + if ( m_mc ) { + const LHCb::MCParticle* truejet = jet_deltar_truthmatch( jets[i], alltruthjets ); + fillTrueJet( jets[i], truejet, head, tuple, i == 0 ? m_jetprefix + "jet" : m_jetprefix + "jet" + jetidx ); + } + } else { + fillJet( 0, head, tuple, i == 0 ? m_jetprefix + "jet" : m_jetprefix + "jet" + jetidx ); + if ( m_mc ) { fillTrueJet( 0, 0, head, tuple, i == 0 ? m_jetprefix + "jet" : m_jetprefix + "jet" + jetidx ); } + } + } + + if ( m_fillsigjet ) { + if ( noidjets.size() > 0 ) + fillJet( noidjets[0], head, tuple, m_jetprefix + "sigjet" ); + else + fillJet( part, head, tuple, m_jetprefix + "sigjet" ); + } + + // fill in jet multiplicities + std::vector mults( m_multpts.size(), 0 ); + for ( unsigned int i = 0; i < jets.size(); ++i ) { + for ( unsigned int j = 0; j < m_multpts.size(); ++j ) { + if ( jets[i]->pt() > m_multpts[j] ) mults[j]++; + } + } + // add to tuple + for ( unsigned int j = 0; j < m_multpts.size(); ++j ) { + // convert pt threshold to a string + char pt[4]; + sprintf( pt, "%i", ( int( m_multpts[j] / 1000 ) ) ); + std::string pt_thres( pt ); + tuple->column( prefix + "_" + m_jetprefix + "jetmult" + pt_thres, mults[j] ); + } + return StatusCode( test ); +} + +bool TupleToolJetInfo::fillJet( const LHCb::Particle* jet, const std::string& head, Tuples::Tuple& tuple, + const std::string& suffix ) { + bool test = true; + std::string tail = ( suffix == "" ) ? suffix : "_" + suffix; + if ( jet && ( !isnan( jet->info( LHCb::JECInfo::JEC, -999.0 ) ) ) ) { + test &= tuple->column( head + tail + "_PT", jet->pt() ); + test &= tuple->column( head + tail + "_PX", jet->momentum().px() ); + test &= tuple->column( head + tail + "_PY", jet->momentum().py() ); + test &= tuple->column( head + tail + "_PZ", jet->momentum().pz() ); + test &= tuple->column( head + tail + "_PE", jet->momentum().e() ); + test &= tuple->column( head + tail + "_ETA", jet->momentum().eta() ); + test &= tuple->column( head + tail + "_PHI", jet->momentum().phi() ); + test &= tuple->column( head + tail + "_M", jet->momentum().M() ); + test &= tuple->column( head + tail + "_MM", jet->measuredMass() ); + test &= tuple->column( head + tail + "_ndauts", (int)jet->daughters().size() ); + test &= tuple->column( head + tail + "_mpt", jet->info( LHCb::JetIDInfo::MPT, -999.0 ) ); + test &= tuple->column( head + tail + "_mtf", jet->info( LHCb::JetIDInfo::MTF, -999.0 ) ); + // test &= tuple->column(head+tail+"_mpf", jet->info(LHCb::JetIDInfo::MPF,-999.0)); + test &= tuple->column( head + tail + "_cpf", jet->info( LHCb::JetIDInfo::CPF, -999.0 ) ); + test &= tuple->column( head + tail + "_n90", jet->info( LHCb::JetIDInfo::N90, -999.0 ) ); + test &= tuple->column( head + tail + "_npoint", jet->info( LHCb::JetIDInfo::Ntracks, -999.0 ) ); + test &= tuple->column( head + tail + "_width", jet->info( LHCb::JetIDInfo::JetWidth, -999.0 ) ); + test &= tuple->column( head + tail + "_jec", jet->info( LHCb::JECInfo::JEC, -999.0 ) ); + test &= tuple->column( head + tail + "_jecerr", jet->info( LHCb::JECInfo::JECError, -999.0 ) ); + test &= tuple->column( head + tail + "_npvsforjec", jet->info( LHCb::JECInfo::NPVsForJEC, -999.0 ) ); + + const LHCb::Vertex* jet_vertex = jet->endVertex(); + double jet_vertex_x = jet_vertex ? jet_vertex->position().X() : -1.0; + double jet_vertex_y = jet_vertex ? jet_vertex->position().Y() : -1.0; + double jet_vertex_z = jet_vertex ? jet_vertex->position().Z() : -1.0; + test &= tuple->column( head + tail + "_vtx_x", jet_vertex_x ); + test &= tuple->column( head + tail + "_vtx_y", jet_vertex_y ); + test &= tuple->column( head + tail + "_vtx_z", jet_vertex_z ); + + if ( m_flavourvars ) { + std::map flav_vars = get_tagging_vars( jet ); + std::map::iterator iv; + for ( iv = flav_vars.begin(); iv != flav_vars.end(); ++iv ) { + test &= tuple->column( head + tail + "_" + ( *iv ).first, ( *iv ).second ); + } + std::map ip_vars = get_ip_vars( jet ); + for ( iv = ip_vars.begin(); iv != ip_vars.end(); ++iv ) { + test &= tuple->column( head + tail + "_" + ( *iv ).first, ( *iv ).second ); + } + } + + if ( m_tag ) { + std::map jetWeights; + for ( unsigned int i = 0; i < m_jetTaggers.size(); ++i ) { + jetWeights.clear(); + m_jetTaggers.at( i )->calculateJetProperty( jet, jetWeights ); + test &= fillTagInfo( m_jettaggernames.at( i ), head, tail, tuple, jetWeights ); + } + jetWeights.clear(); + m_jetTagger->calculateJetProperty( jet, jetWeights ); + test &= fillTagInfo( m_jettaggername, head, tail, tuple, jetWeights ); + } + } else { + test &= tuple->column( head + tail + "_PT", -1.0 ); + test &= tuple->column( head + tail + "_PX", -1.0 ); + test &= tuple->column( head + tail + "_PY", -1.0 ); + test &= tuple->column( head + tail + "_PZ", -1.0 ); + test &= tuple->column( head + tail + "_PE", -1.0 ); + test &= tuple->column( head + tail + "_ETA", -1.0 ); + test &= tuple->column( head + tail + "_PHI", -1.0 ); + test &= tuple->column( head + tail + "_M", -1.0 ); + test &= tuple->column( head + tail + "_MM", -1.0 ); + test &= tuple->column( head + tail + "_ndauts", 0 ); + test &= tuple->column( head + tail + "_mpt", -1.0 ); + test &= tuple->column( head + tail + "_mtf", -1.0 ); + test &= tuple->column( head + tail + "_cpf", -1.0 ); + test &= tuple->column( head + tail + "_n90", -1.0 ); + test &= tuple->column( head + tail + "_npoint", -1.0 ); + test &= tuple->column( head + tail + "_width", -1.0 ); + test &= tuple->column( head + tail + "_jec", -1.0 ); + test &= tuple->column( head + tail + "_vtx_x", -1.0 ); + test &= tuple->column( head + tail + "_vtx_y", -1.0 ); + test &= tuple->column( head + tail + "_vtx_z", -1.0 ); + test &= tuple->column( head + tail + "_jecerr", -1.0 ); + test &= tuple->column( head + tail + "_npvsforjec", -1.0 ); + + if ( m_tag ) { + std::map dummy; + test &= fillTagInfo( m_jettaggername, head, tail, tuple, dummy ); + for ( unsigned int i = 0; i < m_jetTaggers.size(); ++i ) { + fillTagInfo( m_jettaggernames.at( i ), head, tail, tuple, dummy ); + } + } + // std::cout<<"still going"< flav_vars = get_tagging_vars( jet ); + std::map::iterator iv; + // std::cout<<"getting flavour vars"<column( head + tail + "_" + ( *iv ).first, -1.0 ); + } + std::map ip_vars = get_ip_vars( jet ); + // std::cout<<"getting ip vars"<column( head + tail + "_" + ( *iv ).first, -1.0 ); + } + } + } + return test; +} + +bool TupleToolJetInfo::fillTrueJet( const LHCb::Particle* jet, const LHCb::MCParticle* mcjet, const std::string& head, + Tuples::Tuple& tuple, const std::string& suffix ) { + bool test = true; + if ( jet && mcjet ) { + double deltaR = delta_r( jet->momentum(), mcjet->momentum() ); + test &= tuple->column( head + "_mc" + suffix + "_deltaR", deltaR ); + test &= tuple->column( head + "_mc" + suffix + "_PT", mcjet->pt() ); + test &= tuple->column( head + "_mc" + suffix + "_PX", mcjet->momentum().px() ); + test &= tuple->column( head + "_mc" + suffix + "_PY", mcjet->momentum().py() ); + test &= tuple->column( head + "_mc" + suffix + "_PZ", mcjet->momentum().pz() ); + test &= tuple->column( head + "_mc" + suffix + "_PE", mcjet->momentum().e() ); + test &= tuple->column( head + "_mc" + suffix + "_ETA", mcjet->momentum().eta() ); + test &= tuple->column( head + "_mc" + suffix + "_PHI", mcjet->momentum().phi() ); + test &= tuple->column( head + "_mc" + suffix + "_M", mcjet->momentum().M() ); + // test &= tuple->column(head+"_mc"+suffix+"_MM", mcjet->measuredMass()); + // test &= tuple->column(head+"_mc"+suffix+"_ndauts", (int)mcjet->daughters().size()); + // test &= tuple->column(head+"_mc"+suffix+"_mpt", mcjet->info(LHCb::JetIDInfo::MPT,-999.0)); + // test &= tuple->column(head+"_mc"+suffix+"_mpf", mcjet->info(LHCb::JetIDInfo::MPF,-999.0)); + // test &= tuple->column(head+"_mc"+suffix+"_mtf", mcjet->info(LHCb::JetIDInfo::MTF,-999.0)); + // test &= tuple->column(head+"_mc"+suffix+"_cpf", mcjet->info(LHCb::JetIDInfo::CPF,-999.0)); + // test &= tuple->column(head+"_mc"+suffix+"_n90", mcjet->info(LHCb::JetIDInfo::N90,-999.0)); + // test &= tuple->column(head+"_mc"+suffix+"_npoint", mcjet->info(LHCb::JetIDInfo::Ntracks,-999.0)); + // test &= tuple->column(head+"_mc"+suffix+"_width", mcjet->info(LHCb::JetIDInfo::JetWidth,-999.0)); + + // get jet flavour + std::pair flav = get_jet_flavour( mcjet ); + test &= tuple->column( head + "_mc" + suffix + "_flavour", flav.first ); + test &= tuple->column( head + "_mc" + suffix + "_flavourpt", flav.second ); + + } else { + test &= tuple->column( head + "_mc" + suffix + "_deltaR", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_PT", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_PX", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_PY", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_PZ", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_PE", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_ETA", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_PHI", -1.0 ); + test &= tuple->column( head + "_mc" + suffix + "_M", -1.0 ); + // test &= tuple->column(head+"_mc"+suffix+"_MM", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_ndauts", -1); + // test &= tuple->column(head+"_mc"+suffix+"_mpt", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_mtf", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_mpf", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_cpf", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_n90", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_npoint", -1.0); + // test &= tuple->column(head+"_mc"+suffix+"_width", -1.0); + test &= tuple->column( head + "_mc" + suffix + "_flavour", -999 ); + test &= tuple->column( head + "_mc" + suffix + "_flavourpt", -999.0 ); + } + return test; +} + +std::vector TupleToolJetInfo::getdecaytree( const LHCb::Particle* top ) { + // This function just adds one set of daughters to another + // Should be generalised + std::vector tree; + std::vector dauts = top->daughtersVector(); + if ( dauts.size() == 0 ) + tree.push_back( top ); + else + tree.insert( tree.end(), dauts.begin(), dauts.end() ); + return tree; +} + +std::vector TupleToolJetInfo::getprotos( std::vector parts ) { + std::vector protos; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + const LHCb::ProtoParticle* proto = ( *ip )->proto(); + if ( proto ) protos.push_back( proto ); + } + return protos; +} + +std::vector TupleToolJetInfo::gettracks( std::vector parts ) { + std::vector tracks; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + const LHCb::ProtoParticle* proto = ( *ip )->proto(); + if ( proto ) { + const LHCb::Track* track = proto->track(); + if ( track ) tracks.push_back( track ); + } + } + return tracks; +} + +bool TupleToolJetInfo::partinjet( const LHCb::Particle* jet, const LHCb::Particle* part ) { + bool inJet = false; + std::vector parts = getdecaytree( part ); + std::vector protos = getprotos( parts ); + + std::vector jetDauts = jet->daughtersVector(); + for ( std::vector::iterator ij = jetDauts.begin(); ij != jetDauts.end(); ++ij ) { + const LHCb::ProtoParticle* jet_proto = ( *ij )->proto(); + for ( std::vector::iterator ip = protos.begin(); ip != protos.end(); ++ip ) { + if ( jet_proto && jet_proto == ( *ip ) ) inJet = true; + } + } + return inJet; +} + +double TupleToolJetInfo::delta_r( const LHCb::Particle* j, const LHCb::Particle* part ) { + + double d_phi = ( part->momentum().Phi() ) - ( j->momentum().Phi() ); + if ( d_phi < 0 ) { d_phi += 2 * M_PI; } + if ( d_phi > M_PI ) { d_phi -= 2.0 * M_PI; } + + // checked - below formula gives the same dphi^2 + // double dPhi = fabs(part->momentum().Phi() - j->momentum().Phi()) < M_PI ? + // fabs(part->momentum().Phi() - j->momentum().Phi()) : + // 2*M_PI- fabs(part->momentum().Phi() - j->momentum().Phi()); + + double d_eta = ( part->momentum().Eta() ) - ( j->momentum().Eta() ); + + double dr = sqrt( d_phi * d_phi + d_eta * d_eta ); + + return dr; +} + +double TupleToolJetInfo::delta_r( const Gaudi::LorentzVector& a, const Gaudi::LorentzVector& b ) { + double d_phi = a.Phi() - b.Phi(); + if ( d_phi < 0 ) { d_phi += 2 * M_PI; } + if ( d_phi > M_PI ) { d_phi -= 2.0 * M_PI; } + + double d_eta = a.Eta() - b.Eta(); + + double dr = sqrt( d_phi * d_phi + d_eta * d_eta ); + + return dr; +} + +double TupleToolJetInfo::delta_r( const LHCb::Particle* j, std::vector parts ) { + // Minimum delta R between jet and vector of particles + double dr = -1; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + double d_r = delta_r( j, ( *ip ) ); + if ( d_r < dr || dr == -1 ) dr = d_r; + } + return dr; +} + +double TupleToolJetInfo::delta_r( const LHCb::MCParticle* j, std::vector parts ) { + // Minimum delta R between jet and vector of particles + double dr = -1; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + double d_r = delta_r( j->momentum(), ( *ip )->momentum() ); + if ( d_r < dr || dr == -1 ) dr = d_r; + } + return dr; +} + +const LHCb::MCParticle* +TupleToolJetInfo::jet_deltar_truthmatch( const LHCb::Particle* jet, + std::vector truthjets2match ) { + // Highest pt jet within deltar + const LHCb::MCParticle* truthjet = 0; + for ( std::vector::iterator ij = truthjets2match.begin(); ij != truthjets2match.end(); + ++ij ) { + double deltar = delta_r( jet->momentum(), ( *ij )->momentum() ); + if ( deltar < m_deltaR ) { + if ( truthjet == 0 || ( *ij )->pt() > truthjet->pt() ) truthjet = ( *ij ); + } + } + return truthjet; +} + +std::pair TupleToolJetInfo::get_jet_flavour( const LHCb::MCParticle* jet ) { + if ( !jet || !m_mcparts ) { return std::pair( 0, 0.0 ); } + int flavour = -999; + double pt = -1; + // true tag the jet using parton information + if ( m_tagbyparton ) { + std::vector partons, hadrons; + for ( LHCb::MCParticles::iterator ip = m_mcparts->begin(); ip != m_mcparts->end(); ++ip ) { + double pt = ( *ip )->pt(); + int id = abs( ( *ip )->particleID().pid() ); + if ( pt > 2000 && ( id < 6 || id == 21 ) ) partons.push_back( ( *ip ) ); + } + double dR = -1; + std::vector::iterator ip; + for ( ip = partons.begin(); ip != partons.end(); ++ip ) { + double dR_tmp = delta_r( ( *ip )->momentum(), jet->momentum() ); + double pt_tmp = ( *ip )->pt(); + // if both are within 0.3, pick highest pt one, else pick closest + /* + if ( (dR_tmp < 0.3 && dR < 0.3 && dR != -1 )){ + if (pt_tmp > pt){ + pt = pt_tmp; + dR = dR_tmp; + flavour = (*ip)->particleID().pid(); + } + }*/ + if ( dR_tmp < 0.5 && ( dR_tmp < dR || dR == -1 ) ) { + dR = dR_tmp; + pt = pt_tmp; + flavour = ( *ip )->particleID().pid(); + } + } + } else { + // true tag using hadron information + bool hasB = false, hasC = false; + std::vector partons, hadrons; + for ( LHCb::MCParticles::iterator ip = m_mcparts->begin(); ip != m_mcparts->end(); ++ip ) { + double pt_tmp = ( *ip )->pt(); + if ( pt_tmp < 2000 ) continue; + if ( ( *ip )->particleID().hasQuark( LHCb::ParticleID::bottom ) && + delta_r( ( *ip )->momentum(), jet->momentum() ) < 0.5 ) { + hasB = true; + if ( pt_tmp > pt ) pt = pt_tmp; + } + if ( ( *ip )->particleID().hasQuark( LHCb::ParticleID::charm ) && + delta_r( ( *ip )->momentum(), jet->momentum() ) < 0.5 ) { + hasC = true; + if ( pt_tmp > pt ) pt = pt_tmp; + } + } + if ( hasB ) + flavour = 5; + else if ( hasC ) + flavour = 4; + else + flavour = 0; + } + return std::pair( flavour, pt ); +} + +double TupleToolJetInfo::get_jet_width( const LHCb::Particle* jet ) { + double denom = 0.0; + double num = 0.0; + + const SmartRefVector daughters = jet->daughters(); + SmartRefVector::const_iterator ip; + + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + num += delta_r( ( *ip )->momentum(), jet->momentum() ) * ( ( *ip )->pt() ); + denom += ( *ip )->pt(); + } + double width = num / denom; + return width; +} + +double TupleToolJetInfo::get_jet_charge( const LHCb::Particle* jet ) { + double denom = 0.0; + double num = 0.0; + + const SmartRefVector daughters = jet->daughters(); + SmartRefVector::const_iterator ip; + + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + num += ( *ip )->charge() * ( ( *ip )->pt() ); + denom += ( *ip )->pt(); + } + double width = num / denom; + return width; +} + +std::map TupleToolJetInfo::get_ip_vars( const LHCb::Particle* jet ) { + std::map vars; + vars["avip"] = -1.0; + vars["avipchi2"] = -1.0; + vars["avipchi2w"] = -1.0; + vars["leading_ip"] = -1.0; + vars["leading_ipchi2"] = -1.0; + if ( !jet ) return vars; + + const LHCb::VertexBase* pv = m_dva->bestVertex( jet ); + + const SmartRefVector daughters = jet->daughters(); + SmartRefVector::const_iterator ij; + double avip = 0.0, avipchi2 = 0.0, avipchi2w = 0.0, leading_ip = 0.0, leading_ipchi2 = 0.0, leading_muip = 0.0, + leading_muipchi2 = 0.0; + int n = 0; + double sumpt = 0; + double pt = -1.0; + double ptmu = -1.0; + for ( ij = daughters.begin(); ij != daughters.end(); ++ij ) { + if ( ( *ij )->proto() && ( *ij )->proto()->track() ) { + double ip, ipchi2; + m_dist->distance( ( *ij ), pv, ip, ipchi2 ); + + double pt_tmp = ( *ij )->pt(); + + if ( ( *ij )->proto()->muonPID() && ( *ij )->proto()->muonPID()->IsMuon() ) { + if ( pt_tmp > ptmu || ptmu == -1.0 ) { + leading_muip = ip; + leading_muipchi2 = ipchi2; + } + } + + if ( pt_tmp > pt || pt == -1.0 ) { + leading_ip = ip; + leading_ipchi2 = ipchi2; + } + + avip += ip * pt_tmp; + avipchi2 += ipchi2; + avipchi2w += ipchi2 * pt_tmp; + n++; + sumpt += ( *ij )->pt(); + } + } + avip = avip / sumpt; + avipchi2 = avipchi2 / n; + avipchi2w = avipchi2w / sumpt; + + vars["avip"] = avip; + vars["avipchi2"] = avipchi2; + vars["avipchi2w"] = avipchi2w; + vars["leading_ip"] = leading_ip; + vars["leading_ipchi2"] = leading_ipchi2; + vars["leading_muip"] = leading_muip; + vars["leading_muipchi2"] = leading_muipchi2; + return vars; +} + +std::map TupleToolJetInfo::get_tagging_vars( const LHCb::Particle* jet ) { + std::map vars; + vars["kaonpt"] = -1.0; + vars["pionpt"] = -1.0; + vars["K_dR"] = -1.0; + vars["pi_dR"] = -1.0; + vars["maxkaonpt"] = -1.0; + vars["maxpionpt"] = -1.0; + vars["kaonmult"] = -1.0; + vars["kaoncmult"] = -1.0; + vars["pionmult"] = -1.0; + vars["pioncmult"] = -1.0; + vars["charge"] = -1.0; + vars["width"] = -1.0; + vars["leading_id"] = -1.0; + vars["leading_pt"] = -1.0; + vars["leading_mupt"] = -1.0; + vars["ipav"] = -1.0; + + if ( jet ) { + const SmartRefVector daughters = jet->daughters(); + SmartRefVector::const_iterator ip; + double kaonpt = 0.0, pionpt = 0.0, muonpt = 0.0; + double K_dR = -1.0, pi_dR = -1.0, muon_dR = -1.0; + double maxkaonpt = -1.0, maxpionpt = -1.0, maxmuonpt = -1.0, maxpt = -1.0; + double muon_ptrel = -1.0, kaon_ptrel = -1.0, pion_ptrel = -1.0; + double maxid = -1.0; + double kaonmult = 0, pionmult = 0, kaoncmult = 0, pioncmult = 0, muonmult = 0; + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + double pt = ( *ip )->pt(); + double dR = delta_r( ( *ip )->momentum(), jet->momentum() ); + int id = abs( ( *ip )->particleID().pid() ); + // double ptrel = std::sqrt(jet->momentum().Vect().Perp2((*ip)->momentum().Vect())); + double ptrel = + std::sqrt( ( *ip )->momentum().Vect().mag2() - + ( jet->momentum().Vect().Dot( ( *ip )->momentum().Vect() ) / jet->momentum().Vect().mag2() ) ); + + // exclude photons + if ( ( pt > maxpt || pt == -1.0 ) && id != 22 ) { + maxid = double( id ); + maxpt = pt; + } + + if ( id == 111 || id == 211 || id == 113 || id == 213 || id == 221 || id == 331 ) { + // light + pionpt += pt; + if ( maxpionpt == -1.0 || pt > maxpionpt ) { + maxpionpt = pt; + pi_dR = dR; + pion_ptrel = ptrel; + } + pionmult++; + if ( id == 211 ) pioncmult++; + + } else if ( id == 130 || id == 310 || id == 311 || id == 311 || id == 321 ) { + // strange + kaonpt += pt; + + if ( maxkaonpt == -1.0 || pt > maxkaonpt ) { + maxkaonpt = pt; + K_dR = dR; + kaon_ptrel = ptrel; + } + kaonmult++; + if ( id == 321 ) kaoncmult++; + + } else if ( id == 13 || id == -13 ) { + // strange + muonpt += pt; + + if ( maxmuonpt == -1.0 || pt > maxmuonpt ) { + maxmuonpt = pt; + muon_dR = dR; + muon_ptrel = ptrel; + } + muonmult++; + } + } + + vars["kaonpt"] = kaonpt; + vars["pionpt"] = pionpt; + vars["muonpt"] = kaonpt; + vars["K_dR"] = K_dR; + vars["pi_dR"] = pi_dR; + vars["K_dR"] = muon_dR; + vars["maxkaonpt"] = maxkaonpt; + vars["maxpionpt"] = maxpionpt; + vars["maxmuonpt"] = maxmuonpt; + vars["kaon_ptrel"] = kaon_ptrel; + vars["pion_ptrel"] = pion_ptrel; + vars["muon_ptrel"] = muon_ptrel; + vars["kaonmult"] = kaonmult; + vars["kaoncmult"] = kaoncmult; + vars["pionmult"] = pionmult; + vars["pioncmult"] = pioncmult; + vars["muonmult"] = muonmult; + vars["width"] = get_jet_width( jet ); + vars["charge"] = get_jet_charge( jet ); + vars["leading_id"] = maxid; + vars["leading_pt"] = maxpt; + } + return vars; +} + +bool TupleToolJetInfo::fillTagInfo( std::string tagger, const std::string& head, const std::string& tail, + Tuples::Tuple& tuple, std::map jetWeights ) { + std::vector vars; + std::string tag = "Tag"; + if ( tagger == "LoKi::BDTTag" ) { + vars.push_back( "Tag0_absQsum" ); + vars.push_back( "Tag0_backwards" ); + vars.push_back( "Tag0_bdt0" ); + vars.push_back( "Tag0_bdt1" ); + vars.push_back( "Tag0_drSvrJet" ); + vars.push_back( "Tag0_fdChi2" ); + vars.push_back( "Tag0_fdrMin" ); + vars.push_back( "Tag0_m" ); + vars.push_back( "Tag0_mCor" ); + vars.push_back( "Tag0_nTrk" ); + vars.push_back( "Tag0_nTrkJet" ); + vars.push_back( "Tag0_pass" ); + vars.push_back( "Tag0_pt" ); + vars.push_back( "Tag0_ptSvrJet" ); + vars.push_back( "Tag0_tau" ); + vars.push_back( "Tag0_z" ); + vars.push_back( "Tag0_tbvs" ); + vars.push_back( "Tag0_ipChi2Sum" ); + tag = "BDTTag"; + } else if ( tagger == "LoKi::NNBTag" ) { + vars.push_back( "j_max_trk_netout" ); + vars.push_back( "j_sum_trk_netout" ); + vars.push_back( "j_pt" ); + vars.push_back( "j_max_trk_pt" ); + vars.push_back( "j_max_trk_ipsig" ); + vars.push_back( "j_max_trk_ip" ); + vars.push_back( "j_trk_ktsum" ); + vars.push_back( "j_ip_tag_sum" ); + vars.push_back( "j_ip_tag_2nd" ); + vars.push_back( "j_ip_tag_3rd" ); + vars.push_back( "j_nb_net" ); + vars.push_back( "ExtraInfo" ); + tag = "NNBTag"; + } + bool test = true; + for ( unsigned int i = 0; i < vars.size(); ++i ) { + if ( jetWeights.empty() ) + test &= tuple->column( head + tail + "_" + vars.at( i ), -999.0 ); + else + test &= tuple->column( head + tail + "_" + vars.at( i ), jetWeights[vars.at( i )] ); + } + test &= tuple->column( head + tail + "_" + tag, jetWeights["Tag"] ); + + return test; +} diff --git a/Phys/DecayTreeTupleJets/src/TupleToolJetInfo.h b/Phys/DecayTreeTupleJets/src/TupleToolJetInfo.h new file mode 100644 index 00000000..e72701ee --- /dev/null +++ b/Phys/DecayTreeTupleJets/src/TupleToolJetInfo.h @@ -0,0 +1,94 @@ +/*****************************************************************************\ +* (c) Copyright 2020 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. * +\*****************************************************************************/ +// $Id: TupleToolJetInfo.h +#ifndef TupleToolJetInfo_H +#define TupleToolJetInfo_H 1 + +// Include files +// from DaVinci, this is a specialized GaudiAlgorithm +//#include "Kernel/DVAlgorithm.h" +#include "DecayTreeTupleBase/TupleToolBase.h" +#include "Event/MCParticle.h" +#include "Kernel/IJetTagTool.h" +#include "Kernel/IParticleTupleTool.h" + +class TupleToolJetInfo : public TupleToolBase, virtual public IParticleTupleTool { +public: + /// Standard constructor + TupleToolJetInfo( const std::string& type, const std::string& name, const IInterface* parent ); + /// Loop over the particles not in the decay and fill them into a vector + virtual StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple& ); + + bool fillJet( const LHCb::Particle* jet, const std::string& head, Tuples::Tuple& tuple, + const std::string& suffix = "" ); + bool fillTrueJet( const LHCb::Particle* jet, const LHCb::MCParticle* mcjet, const std::string& head, + Tuples::Tuple& tuple, const std::string& suffix = "" ); + bool fillTagInfo( std::string tagger, const std::string& head, const std::string& tail, Tuples::Tuple& tuple, + std::map jetWeights ); + bool partinjet( const LHCb::Particle* j, const LHCb::Particle* part ); + double delta_r( const Gaudi::LorentzVector& a, const Gaudi::LorentzVector& b ); + double delta_r( const LHCb::Particle* j, const LHCb::Particle* part ); + double delta_r( const LHCb::Particle* j, std::vector parts ); + double delta_r( const LHCb::MCParticle* j, std::vector parts ); + std::vector getprotos( std::vector parts ); + std::vector gettracks( std::vector parts ); + std::vector getdecaytree( const LHCb::Particle* top ); + const LHCb::MCParticle* jet_deltar_truthmatch( const LHCb::Particle* jet, + std::vector truthjets ); + + virtual ~TupleToolJetInfo(); ///< Destructor + + virtual StatusCode initialize(); ///< Algorithm initialization + + std::pair get_jet_flavour( const LHCb::MCParticle* mcjet ); + double get_jet_width( const LHCb::Particle* jet ); + double get_jet_charge( const LHCb::Particle* jet ); + + std::map get_tagging_vars( const LHCb::Particle* jet ); + std::map get_ip_vars( const LHCb::Particle* jet ); + + struct pred { + bool operator()( const LHCb::Particle* a, const LHCb::Particle* b ) const { return a->pt() > b->pt(); } + bool operator()( const LHCb::MCParticle* a, const LHCb::MCParticle* b ) const { return a->pt() > b->pt(); } + }; + +protected: +private: + IDVAlgorithm* m_dva; + const IDistanceCalculator* m_dist; + + IJetTagTool* m_jetTagger; + std::vector m_jetTaggers; + + int m_njets; + bool m_fillsigjet; + bool m_flavourvars; + bool m_tag; + bool m_applytag; + bool m_filltag; + bool m_tagbyparton; + bool m_mc; + double m_deltaR; + bool m_samepv; + std::vector m_jetetarange; + std::vector m_multpts; + + std::string m_jetlocation; + std::string m_noidjetlocation; + std::string m_mcjetlocation; + std::string m_jettaggername; + std::string m_jetprefix; + std::vector m_jettaggernames; + + LHCb::MCParticles* m_mcparts; +}; + +#endif // TupleToolJetInfo_H diff --git a/Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.cpp b/Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.cpp new file mode 100644 index 00000000..777e2247 --- /dev/null +++ b/Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.cpp @@ -0,0 +1,752 @@ +/*****************************************************************************\ +* (c) Copyright 2020 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. * +\*****************************************************************************/ +//#include "GaudiKernel/ToolFactory.h" +#include "TupleToolMC2Jet.h" +#include "Event/ODIN.h" +#include "Event/Particle.h" +#include "GaudiAlg/Tuple.h" +#include "GaudiAlg/TupleObj.h" +#include "GaudiKernel/PhysicalConstants.h" +#include "Kernel/GetIDVAlgorithm.h" +#include "Kernel/IDVAlgorithm.h" +#include "Kernel/IJetMaker.h" +#include "Kernel/JetEnums.h" +#include "LoKi/ParticleContextCuts.h" +#include "LoKi/ParticleCuts.h" +#include "LoKi/PhysTypes.h" +#include "LoKi/VertexCuts.h" +//#include +//----------------------------------------------------------------------------- +// Implementation file for class : TupleToolMC2Jet +//----------------------------------------------------------------------------- + +using namespace Gaudi; // for event etc... +using namespace LHCb; + +// Declaration of the Algorithm Factory +DECLARE_COMPONENT( TupleToolMC2Jet ) +//============================================================================= +// Standard constructor, initializes variables +//============================================================================= +TupleToolMC2Jet::TupleToolMC2Jet( const std::string& type, const std::string& name, const IInterface* parent ) + : TupleToolBase( type, name, parent ) + , m_dva( 0 ) + +{ + declareInterface( this ); + declareProperty( "PartContainer", m_MC2RecLoc = "Phys/StdAllNoPIDsPions/Particles" ); + declareProperty( "JetLocation", m_jetlocation = "Phys/StdPFJets/Particles" ); + declareProperty( "MCJetLocation", m_mcjetlocation = "Phys/TrueJets/Particles" ); + declareProperty( "DeltaR", m_deltaR = 0.5 ); + declareProperty( "nJets", m_njets = 1 ); + declareProperty( "JetEtaRange", m_jetetarange ); // if empty, initialised to [2, 4.5] below + declareProperty( "MultPts", m_multpts ); // if empty, initialised to [10] below + declareProperty( "JetPrefix", m_jetprefix = "" ); + declareProperty( "SamePV", m_samepv = true ); + declareProperty( "FitName", m_fitName = "LoKi::VertexFitter", "Name of the vertex fitter tool used to create SVRs." ); + declareProperty( "DstName", m_dstName = "LoKi::DistanceCalculator:PUBLIC", + "Name of the distance calculator tool used to create SVRs." ); + declareProperty( "PvrLocation", m_pvrLocation = RecVertexLocation::Primary, + "TES location of PVRs used when building the SVRs." ); + m_p2mcAssocTypes.push_back( "DaVinciSmartAssociator" ); + m_p2mcAssocTypes.push_back( "MCMatchObjP2MCRelator" ); +} +//============================================================================= +// Destructor +//============================================================================= +TupleToolMC2Jet::~TupleToolMC2Jet() {} + +//============================================================================= +// Initialization +//============================================================================= +StatusCode TupleToolMC2Jet::initialize() { + StatusCode sc = TupleToolBase::initialize(); + if ( sc.isFailure() ) return sc; + + if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; + + m_mcpartLinker = new Object2FromMC( this, Particle2MCMethod::Links, m_MC2RecLoc ); + m_dva = Gaudi::Utils::getIDVAlgorithm( contextSvc(), this ); + if ( !m_dva ) return Error( "Couldn't get parent DVAlgorithm" ); + + if ( m_jetetarange.size() == 0 ) { + m_jetetarange.push_back( 2.0 ); + m_jetetarange.push_back( 4.5 ); + } + if ( m_multpts.size() == 0 ) { m_multpts.push_back( 20000 ); } + + m_fitTool = tool( m_fitName, this ); + if ( !m_fitTool ) { + error() << "Failed to create the vertex fitter." << endmsg; + return StatusCode::FAILURE; + } + + m_dstTool = tool( m_dstName, this ); + if ( !m_dstTool ) { + error() << "Failed to create the dst tool." << endmsg; + return StatusCode::FAILURE; + } + + m_p2mcAssocs.clear(); + for ( std::vector::const_iterator iMCAss = m_p2mcAssocTypes.begin(); iMCAss != m_p2mcAssocTypes.end(); + ++iMCAss ) { + m_p2mcAssocs.push_back( tool( *iMCAss, this ) ); + } + + return StatusCode::SUCCESS; +} + +//============================================================================= +// Fill the tuple +//============================================================================= + +StatusCode TupleToolMC2Jet::fill( const LHCb::Particle* top, const LHCb::Particle* part, const std::string& head, + Tuples::Tuple& tuple ) { + + // Get reco jets + LHCb::Particles* PFjets = get( m_jetlocation ); + + m_mcparts = 0; + + if ( exist( LHCb::MCParticleLocation::Default ) ) { + m_mcparts = getIfExists( LHCb::MCParticleLocation::Default ); + } else { + error() << "Cannot find MC Particle Container" << endmsg; + } + + m_pvrs = getIfExists( m_pvrLocation ); + if ( !m_pvrs ) { + error() << "PVR location " + m_pvrLocation + " not found." << endmsg; + return StatusCode::SUCCESS; + } + + // Just fill if part is a jet + // if ( part->particleID().pid() == 98 || part->particleID().pid() == 99){ + // fillJet(part, head, tuple, "true"+m_jetprefix+"jet"); + // const LHCb::Particle* recjet = jet_deltar_truthmatch(part, PFjets); + // fillRecJet(part, recjet, head, tuple, "true"+m_jetprefix+"jet"); + // return StatusCode::SUCCESS; + //} + + // Get true jets + // LHCb::Particles* PFtruthjets = get(m_mcjetlocation); + LHCb::MCParticles* PFtruthjets = get( m_mcjetlocation ); + + bool test = true; + const std::string prefix = fullName( head ); + if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Fill" << endmsg; + + // Filter into those that in the pseudorapidity range required + // and have the requisite delta R from any particle in the decay chain + // and share the same primary vertex + + Gaudi::XYZPoint vtx( 0.0, 0.0, 0.0 ); + if ( top && top->endVertex() ) + vtx = top->endVertex()->position(); + else { + const LHCb::VertexBase* vtx_base = m_dva->bestVertex( part ); + if ( vtx_base ) vtx = vtx_base->position(); + } + + double z_vertex_x = vtx.X(); + double z_vertex_y = vtx.Y(); + double z_vertex_z = vtx.Z(); + + std::vector jets; + std::vector truthjets; + std::vector alljets; // no eta cut + std::vector alltruthjets; // no eta cut + std::vector dtree = getdecaytree( top ); + std::vector dtree_match; + + for ( std::vector::iterator ip = dtree.begin(); ip != dtree.end(); ++ip ) { + const LHCb::MCParticle* mcp = 0; + for ( std::vector::const_iterator iMCAss = m_p2mcAssocs.begin(); + iMCAss != m_p2mcAssocs.end(); ++iMCAss ) { + mcp = ( *iMCAss )->relatedMCP( *ip ); + if ( mcp ) break; + } + dtree_match.push_back( mcp ); + } + + for ( LHCb::Particles::const_iterator ij = PFjets->begin(); ij != PFjets->end(); ++ij ) { + bool deltaR = delta_r( ( *ij ), dtree ) > m_deltaR; + bool eta = ( *ij )->momentum().eta() > m_jetetarange[0] && ( *ij )->momentum().eta() < m_jetetarange[1]; + + const LHCb::Vertex* jet_vertex = ( *ij )->endVertex(); + bool samepv = true; + + if ( jet_vertex && m_samepv ) { + double jet_vertex_x = jet_vertex->position().X(); + double jet_vertex_y = jet_vertex->position().Y(); + double jet_vertex_z = jet_vertex->position().Z(); + double minDistance = sqrt( ( z_vertex_x - jet_vertex_x ) * ( z_vertex_x - jet_vertex_x ) + + ( z_vertex_y - jet_vertex_y ) * ( z_vertex_y - jet_vertex_y ) + + ( z_vertex_z - jet_vertex_z ) * ( z_vertex_z - jet_vertex_z ) ); + samepv = ( minDistance < 1 ); + } + if ( deltaR && eta && samepv ) jets.push_back( *ij ); + // if ( deltaR && samepv ) alljets.push_back(*ij); + if ( samepv ) alljets.push_back( *ij ); + } + + for ( LHCb::MCParticles::const_iterator ij = PFtruthjets->begin(); ij != PFtruthjets->end(); ++ij ) { + bool deltaR = delta_r( ( *ij ), dtree ) > m_deltaR; + bool eta = ( *ij )->momentum().eta() > m_jetetarange[0] && ( *ij )->momentum().eta() < m_jetetarange[1]; + bool samepv = true; + const LHCb::MCVertex* mcpv = ( *ij )->primaryVertex(); + if ( !mcpv ) break; + const Gaudi::XYZPoint jet_vtx = ( *ij )->primaryVertex()->position(); + for ( std::vector::iterator ip = dtree_match.begin(); ip != dtree_match.end(); ++ip ) { + if ( !( *ip ) ) { + samepv = false; + break; + } + Gaudi::XYZPoint p_vtx = ( *ip )->primaryVertex()->position(); + double dvtx = sqrt( pow( jet_vtx.x() - p_vtx.x(), 2 ) + pow( jet_vtx.y() - p_vtx.y(), 2 ) + + pow( jet_vtx.z() - p_vtx.z(), 2 ) ); + if ( dvtx > 0.1 ) { + samepv = false; + break; + } + } + + if ( deltaR && eta && samepv ) truthjets.push_back( *ij ); + // if ( deltaR && samepv ) alltruthjets.push_back(*ij); + if ( samepv ) alltruthjets.push_back( *ij ); + } + + std::sort( truthjets.begin(), truthjets.end(), pred() ); + + // Now let's fill some stuff + for ( int i = 0; i < m_njets; ++i ) { + // -- Convert jet number to a string + auto jetidx = std::to_string( i ); + if ( (int)truthjets.size() > i ) { + fillJet( truthjets[i], head, tuple, + i == 0 ? "true" + m_jetprefix + "jet" : "true" + m_jetprefix + "jet" + jetidx ); + const LHCb::Particle* recjet = jet_deltar_truthmatch( truthjets[i], alljets ); + fillRecJet( truthjets[i], recjet, head, tuple, + i == 0 ? "true" + m_jetprefix + "jet" : "true" + m_jetprefix + "jet" + jetidx ); + } else { + fillJet( 0, head, tuple, i == 0 ? "true" + m_jetprefix + "jet" : "true" + m_jetprefix + "jet" + jetidx ); + fillRecJet( 0, 0, head, tuple, i == 0 ? "true" + m_jetprefix + "jet" : "true" + m_jetprefix + "jet" + jetidx ); + } + } + + // fill in jet multiplicities + std::vector mults( m_multpts.size(), 0 ); + for ( unsigned int i = 0; i < truthjets.size(); ++i ) { + for ( unsigned int j = 0; j < m_multpts.size(); ++j ) { + if ( truthjets[i]->pt() > m_multpts[j] ) mults[j]++; + } + } + // add to tuple + for ( unsigned int j = 0; j < m_multpts.size(); ++j ) { + // convert pt threshold to a string + auto pt_thres = std::to_string( int( m_multpts[j] / 1000 ) ); + tuple->column( prefix + "_" + m_jetprefix + "_mcmult" + pt_thres, mults[j] ); + } + return StatusCode( test ); +} + +bool TupleToolMC2Jet::fillJet( const LHCb::MCParticle* jet, const std::string& head, Tuples::Tuple& tuple, + const std::string& suffix ) { + bool test = true; + std::string tail = ( suffix == "" ) ? suffix : "_" + suffix; + if ( jet ) { + test &= tuple->column( head + tail + "_PT", jet->pt() ); + test &= tuple->column( head + tail + "_PX", jet->momentum().px() ); + test &= tuple->column( head + tail + "_PY", jet->momentum().py() ); + test &= tuple->column( head + tail + "_PZ", jet->momentum().pz() ); + test &= tuple->column( head + tail + "_PE", jet->momentum().e() ); + test &= tuple->column( head + tail + "_ETA", jet->momentum().eta() ); + test &= tuple->column( head + tail + "_PHI", jet->momentum().phi() ); + test &= tuple->column( head + tail + "_M", jet->momentum().M() ); + // test &= tuple->column(head+tail+"_MM", jet->measuredMass()); + test &= tuple->column( head + tail + "_ndauts", (int)getMCDaughters( jet ).size() ); + // test &= tuple->column(head+tail+"_mpt", jet->info(LHCb::JetIDInfo::MPT,-999.0)); + // test &= tuple->column(head+tail+"_mtf", jet->info(LHCb::JetIDInfo::MTF,-999.0)); + // test &= tuple->column(head+tail+"_cpf", jet->info(LHCb::JetIDInfo::CPF,-999.0)); + // test &= tuple->column(head+tail+"_n90", jet->info(LHCb::JetIDInfo::N90,-999.0)); + // test &= tuple->column(head+tail+"_npoint", jet->info(LHCb::JetIDInfo::Ntracks,-999.0)); + + const LHCb::MCVertex* jet_vertex = jet->primaryVertex(); + double jet_vertex_x = jet_vertex ? jet_vertex->position().X() : -1.0; + double jet_vertex_y = jet_vertex ? jet_vertex->position().Y() : -1.0; + double jet_vertex_z = jet_vertex ? jet_vertex->position().Z() : -1.0; + test &= tuple->column( head + tail + "_vtx_x", jet_vertex_x ); + test &= tuple->column( head + tail + "_vtx_y", jet_vertex_y ); + test &= tuple->column( head + tail + "_vtx_z", jet_vertex_z ); + + // get jet flavour + int flav = get_jet_flavour( jet ); + test &= tuple->column( head + tail + "_flavour", flav ); + // get jet width and charge + double width = get_jet_width( jet ); + double charge = get_jet_charge( jet ); + + test &= tuple->column( head + tail + "_charge", charge ); + test &= tuple->column( head + tail + "_width", width ); + + } else { + test &= tuple->column( head + tail + "_PT", -1.0 ); + test &= tuple->column( head + tail + "_PX", -1.0 ); + test &= tuple->column( head + tail + "_PY", -1.0 ); + test &= tuple->column( head + tail + "_PZ", -1.0 ); + test &= tuple->column( head + tail + "_PE", -1.0 ); + test &= tuple->column( head + tail + "_ETA", -1.0 ); + test &= tuple->column( head + tail + "_PHI", -1.0 ); + test &= tuple->column( head + tail + "_M", -1.0 ); + // test &= tuple->column(head+tail+"_MM", -1.0 ); + test &= tuple->column( head + tail + "_ndauts", 0 ); + // test &= tuple->column(head+tail+"_mpt", -1.0 ); + // test &= tuple->column(head+tail+"_cpf", -1.0 ); + // test &= tuple->column(head+tail+"_mtf", -1.0 ); + // test &= tuple->column(head+tail+"_n90", -1.0 ); + // test &= tuple->column(head+tail+"_npoint", -1.0 ); + test &= tuple->column( head + tail + "_vtx_x", -1.0 ); + test &= tuple->column( head + tail + "_vtx_y", -1.0 ); + test &= tuple->column( head + tail + "_vtx_z", -1.0 ); + test &= tuple->column( head + tail + "_flavour", -999 ); + test &= tuple->column( head + tail + "_charge", -999.0 ); + test &= tuple->column( head + tail + "_width", -1.0 ); + } + fillSV( jet, head, tuple, tail ); + return test; +} + +bool TupleToolMC2Jet::fillRecJet( const LHCb::MCParticle* truejet, const LHCb::Particle* recjet, + const std::string& head, Tuples::Tuple& tuple, const std::string& suffix ) { + bool test = true; + if ( truejet && recjet ) { + double deltaR = delta_r( truejet->momentum(), recjet->momentum() ); + test &= tuple->column( head + "_rec" + suffix + "_deltaR", deltaR ); + test &= tuple->column( head + "_rec" + suffix + "_PT", recjet->pt() ); + test &= tuple->column( head + "_rec" + suffix + "_PX", recjet->momentum().px() ); + test &= tuple->column( head + "_rec" + suffix + "_PY", recjet->momentum().py() ); + test &= tuple->column( head + "_rec" + suffix + "_PZ", recjet->momentum().pz() ); + test &= tuple->column( head + "_rec" + suffix + "_PE", recjet->momentum().e() ); + test &= tuple->column( head + "_rec" + suffix + "_ETA", recjet->momentum().eta() ); + test &= tuple->column( head + "_rec" + suffix + "_PHI", recjet->momentum().phi() ); + test &= tuple->column( head + "_rec" + suffix + "_M", recjet->momentum().M() ); + test &= tuple->column( head + "_rec" + suffix + "_mpt", recjet->info( LHCb::JetIDInfo::MPT, -999.0 ) ); + test &= tuple->column( head + "_rec" + suffix + "_mtf", recjet->info( LHCb::JetIDInfo::MTF, -999.0 ) ); + test &= tuple->column( head + "_rec" + suffix + "_cpf", recjet->info( LHCb::JetIDInfo::CPF, -999.0 ) ); + test &= tuple->column( head + "_rec" + suffix + "_n90", recjet->info( LHCb::JetIDInfo::N90, -999.0 ) ); + test &= tuple->column( head + "_rec" + suffix + "_npoint", recjet->info( LHCb::JetIDInfo::Ntracks, -999.0 ) ); + test &= tuple->column( head + "_rec" + suffix + "_jec", recjet->info( LHCb::JECInfo::JEC, -999.0 ) ); + + const LHCb::Vertex* jet_vertex = recjet->endVertex(); + double jet_vertex_x = jet_vertex ? jet_vertex->position().X() : -1.0; + double jet_vertex_y = jet_vertex ? jet_vertex->position().Y() : -1.0; + double jet_vertex_z = jet_vertex ? jet_vertex->position().Z() : -1.0; + test &= tuple->column( head + "_rec" + suffix + "_vtx_x", jet_vertex_x ); + test &= tuple->column( head + "_rec" + suffix + "_vtx_y", jet_vertex_y ); + test &= tuple->column( head + "_rec" + suffix + "_vtx_z", jet_vertex_z ); + } else { + test &= tuple->column( head + "_rec" + suffix + "_deltaR", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_PT", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_PX", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_PY", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_PZ", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_PE", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_ETA", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_PHI", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_M", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_mpt", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_cpf", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_mtf", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_n90", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_npoint", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_jec", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_vtx_x", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_vtx_y", -1.0 ); + test &= tuple->column( head + "_rec" + suffix + "_vtx_z", -1.0 ); + } + return test; +} + +bool TupleToolMC2Jet::fillSV( const LHCb::MCParticle* jet, const std::string& head, Tuples::Tuple& tuple, + const std::string& suffix ) { + bool test = true; + if ( jet ) { + std::vector daughters = getMCDaughters( jet ); + std::map> pairs; + std::map> recpairs; + for ( auto id : daughters ) { + if ( id->particleID().threeCharge() == 0 ) continue; + const LHCb::MCParticle* mother = id->mother(); + const LHCb::MCParticle* gmother = mother ? mother->mother() : 0; + if ( mother ) { + if ( mother->particleID().hasBottom() || mother->particleID().hasCharm() ) { + pairs[mother].push_back( id ); + LHCb::Particle* rec = m_mcpartLinker->firstP( id ); + if ( rec && ( rec->pt() < 500 || rec->p() < 5000 ) ) rec = 0; + if ( rec && ( ( !rec->proto() ) || ( !rec->proto()->track() ) || + rec->proto()->track()->type() != LHCb::Track::Long ) ) + rec = 0; + recpairs[mother].push_back( rec ); + } else if ( gmother && ( gmother->particleID().hasBottom() || gmother->particleID().hasCharm() ) ) { + pairs[gmother].push_back( id ); + LHCb::Particle* rec = m_mcpartLinker->firstP( id ); + if ( rec && ( rec->pt() < 500 || rec->p() < 5000 ) ) rec = 0; + if ( rec && ( !( rec->proto() ) || + ( !( rec->proto()->track() ) || rec->proto()->track()->type() != LHCb::Track::Long ) ) ) + rec = 0; + recpairs[gmother].push_back( rec ); + } + } + } + int nrec = 0; + double minipchi2( -1.0 ); // the max of the min ip of any pair + double minip( -1.0 ); + double maxtrkchi2( -1.0 ); // the max of the min trkchi2 of any pair + double maxghostprob( -1.0 ); // the min of the max ghostprob of a pair + double mindoca( -1.0 ); // the max doca of a pair + double minpt( -1.0 ), maxpt( -1.0 ); + double svpt( -1.0 ); + + int n = 0; + const LHCb::MCParticle* svmother = 0; + double sv_pt = 0; + + // pick an sv first if there's more than 1 + for ( auto im : pairs ) { + std::vector recs = recpairs[im.first]; + Gaudi::LorentzVector p( 0.0, 0.0, 0.0, 0.0 ); + int ntrkrec = 0.0; + for ( int i = 0; i < (int)im.second.size(); ++i ) { + if ( recs.at( i ) ) { + p += recs.at( i )->momentum(); + ntrkrec++; + } + } + if ( ntrkrec >= 2 ) nrec++; + if ( p.pt() > sv_pt && ntrkrec >= 2 ) { + sv_pt = p.pt(); + svmother = im.first; + } + } + + if ( svmother ) { + std::vector recs = recpairs[svmother]; + for ( int i = 0; i < (int)recs.size(); ++i ) { + if ( recs.at( i ) ) { + if ( recs.at( i )->pt() > minpt ) minpt = recs.at( i )->pt(); + if ( recs.at( i )->pt() < maxpt || maxpt == -1.0 ) maxpt = recs.at( i )->pt(); + } + for ( int j = i + 1; j < (int)recs.size(); ++j ) { + if ( recs.at( i ) && recs.at( j ) ) { + LHCb::Vertex vrt; + LHCb::Particle prt; + std::vector trks; + trks.push_back( recs.at( i ) ); + trks.push_back( recs.at( j ) ); + m_fitTool->fit( trks, vrt, prt ); + svpt = prt.pt(); + if ( vrt.chi2() > 10 ) continue; + n++; + // Calculate track minimum IP chi-squared. + double ip( -1 ), ipChi2( -1 ), ipChi2a( -1 ), ipChi2b( -1 ), ipa( -1 ), ipb( -1 ); + for ( RecVertices::iterator pvr = m_pvrs->begin(); pvr != m_pvrs->end(); ++pvr ) { + m_dstTool->distance( recs.at( i ), *pvr, ip, ipChi2 ); + if ( ipChi2 >= 0 && ( ipChi2a == -1 || ipChi2 < ipChi2a ) ) { + ipChi2a = ipChi2; + ipa = ip; + } + m_dstTool->distance( recs.at( j ), *pvr, ip, ipChi2 ); + if ( ipChi2 >= 0 && ( ipChi2b == -1 || ipChi2 < ipChi2b ) ) { + ipChi2b = ipChi2; + ipb = ip; + } + } + if ( std::min( ipChi2a, ipChi2b ) > minipchi2 || minipchi2 == -1 ) { + minipchi2 = std::min( ipChi2a, ipChi2b ); + minip = std::min( ipa, ipb ); + } + double trkchi2a = recs.at( i )->proto()->track()->chi2() / recs.at( i )->proto()->track()->nDoF(); + double trkchi2b = recs.at( j )->proto()->track()->chi2() / recs.at( j )->proto()->track()->nDoF(); + double maxchi2 = std::max( trkchi2a, trkchi2b ); + if ( maxchi2 < maxtrkchi2 || maxtrkchi2 == -1 ) maxtrkchi2 = maxchi2; + double gproba = recs.at( i )->proto()->track()->ghostProbability(); + double gprobb = recs.at( j )->proto()->track()->ghostProbability(); + double maxgprob = std::max( gproba, gprobb ); + if ( maxgprob < maxghostprob || maxghostprob == -1 ) maxghostprob = maxgprob; + double doca( -1.0 ); + m_dstTool->distance( recs.at( i ), recs.at( j ), doca ); + if ( doca < mindoca || mindoca == -1 ) mindoca = doca; + } + } + } + } + test &= tuple->column( head + suffix + "_nsvs", (int)pairs.size() ); + test &= tuple->column( head + suffix + "_nrecsvs", nrec ); + test &= tuple->column( head + suffix + "_minipchi2", minipchi2 ); + test &= tuple->column( head + suffix + "_minip", minip ); + test &= tuple->column( head + suffix + "_maxtrkchi2ndof", maxtrkchi2 ); + test &= tuple->column( head + suffix + "_maxghostprob", maxghostprob ); + test &= tuple->column( head + suffix + "_mindoca", mindoca ); + test &= tuple->column( head + suffix + "_minpt", minpt ); + test &= tuple->column( head + suffix + "_maxpt", maxpt ); + test &= tuple->column( head + suffix + "_svpt", svpt ); + } else { + test &= tuple->column( head + suffix + "_nsvs", 0 ); + test &= tuple->column( head + suffix + "_nrecsvs", 0 ); + test &= tuple->column( head + suffix + "_minip", -1.0 ); + test &= tuple->column( head + suffix + "_minipchi2", -1.0 ); + test &= tuple->column( head + suffix + "_maxtrkchi2ndof", -1.0 ); + test &= tuple->column( head + suffix + "_maxghostprob", -1.0 ); + test &= tuple->column( head + suffix + "_mindoca", -1.0 ); + test &= tuple->column( head + suffix + "_minpt", -1.0 ); + test &= tuple->column( head + suffix + "_maxpt", -1.0 ); + test &= tuple->column( head + suffix + "_svpt", -1.0 ); + } + return test; +} + +std::vector TupleToolMC2Jet::getdecaytree( const LHCb::Particle* top ) { + // This function just adds one set of daughters to another + // Should be generalised + std::vector tree; + std::vector dauts = top->daughtersVector(); + if ( dauts.size() == 0 ) + tree.push_back( top ); + else + tree.insert( tree.end(), dauts.begin(), dauts.end() ); + return tree; +} + +std::vector TupleToolMC2Jet::getprotos( std::vector parts ) { + std::vector protos; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + const LHCb::ProtoParticle* proto = ( *ip )->proto(); + if ( proto ) protos.push_back( proto ); + } + return protos; +} + +std::vector TupleToolMC2Jet::gettracks( std::vector parts ) { + std::vector tracks; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + const LHCb::ProtoParticle* proto = ( *ip )->proto(); + if ( proto ) { + const LHCb::Track* track = proto->track(); + if ( track ) tracks.push_back( track ); + } + } + return tracks; +} + +bool TupleToolMC2Jet::partinjet( const LHCb::Particle* jet, const LHCb::Particle* part ) { + bool inJet = false; + std::vector parts = getdecaytree( part ); + std::vector protos = getprotos( parts ); + + std::vector jetDauts = jet->daughtersVector(); + for ( std::vector::iterator ij = jetDauts.begin(); ij != jetDauts.end(); ++ij ) { + const LHCb::ProtoParticle* jet_proto = ( *ij )->proto(); + for ( std::vector::iterator ip = protos.begin(); ip != protos.end(); ++ip ) { + if ( jet_proto && jet_proto == ( *ip ) ) inJet = true; + } + } + return inJet; +} + +double TupleToolMC2Jet::delta_r( const LHCb::Particle* j, const LHCb::Particle* part ) { + + double d_phi = ( part->momentum().Phi() ) - ( j->momentum().Phi() ); + if ( d_phi < 0 ) { d_phi += 2 * M_PI; } + if ( d_phi > M_PI ) { d_phi -= 2.0 * M_PI; } + + double d_eta = ( part->momentum().Eta() ) - ( j->momentum().Eta() ); + + double dr = sqrt( d_phi * d_phi + d_eta * d_eta ); + + return dr; +} +double TupleToolMC2Jet::delta_r( const LHCb::MCParticle* j, const LHCb::Particle* part ) { + + double d_phi = ( part->momentum().Phi() ) - ( j->momentum().Phi() ); + if ( d_phi < 0 ) { d_phi += 2 * M_PI; } + if ( d_phi > M_PI ) { d_phi -= 2.0 * M_PI; } + + double d_eta = ( part->momentum().Eta() ) - ( j->momentum().Eta() ); + + double dr = sqrt( d_phi * d_phi + d_eta * d_eta ); + + return dr; +} + +double TupleToolMC2Jet::delta_r( const Gaudi::LorentzVector& a, const Gaudi::LorentzVector& b ) { + double d_phi = a.Phi() - b.Phi(); + if ( d_phi < 0 ) { d_phi += 2 * M_PI; } + if ( d_phi > M_PI ) { d_phi -= 2.0 * M_PI; } + + double d_eta = a.Eta() - b.Eta(); + + double dr = sqrt( d_phi * d_phi + d_eta * d_eta ); + + return dr; +} + +double TupleToolMC2Jet::delta_r( const LHCb::Particle* j, std::vector parts ) { + // Minimum delta R between jet and vector of particles + double dr = -1; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + double d_r = delta_r( j, ( *ip ) ); + if ( d_r < dr || dr == -1 ) dr = d_r; + } + return dr; +} +double TupleToolMC2Jet::delta_r( const LHCb::MCParticle* j, std::vector parts ) { + // Minimum delta R between jet and vector of particles + double dr = -1; + for ( std::vector::iterator ip = parts.begin(); ip != parts.end(); ++ip ) { + double d_r = delta_r( j, ( *ip ) ); + if ( d_r < dr || dr == -1 ) dr = d_r; + } + return dr; +} + +const LHCb::Particle* TupleToolMC2Jet::jet_deltar_truthmatch( const LHCb::MCParticle* jet, + std::vector truthjets ) { + // Highest pt jet within deltar + const LHCb::Particle* truthjet = 0; + for ( std::vector::iterator ij = truthjets.begin(); ij != truthjets.end(); ++ij ) { + double deltar = delta_r( jet->momentum(), ( *ij )->momentum() ); + if ( deltar < m_deltaR ) { + if ( truthjet == 0 || ( *ij )->pt() > truthjet->pt() ) truthjet = ( *ij ); + } + } + return truthjet; +} + +const LHCb::Particle* TupleToolMC2Jet::jet_deltar_truthmatch( const LHCb::MCParticle* jet, + LHCb::Particles* truthjets ) { + // Highest pt jet within deltar + const LHCb::Particle* truthjet = 0; + for ( LHCb::Particles::iterator ij = truthjets->begin(); ij != truthjets->end(); ++ij ) { + double deltar = delta_r( jet->momentum(), ( *ij )->momentum() ); + if ( deltar < m_deltaR ) { + if ( truthjet == 0 || ( *ij )->pt() > truthjet->pt() ) truthjet = ( *ij ); + } + } + return truthjet; +} +int TupleToolMC2Jet::get_jet_flavour( const LHCb::MCParticle* jet ) { + // get partons + std::vector partons; + if ( !jet || !m_mcparts ) { return 0; } + for ( LHCb::MCParticles::iterator ip = m_mcparts->begin(); ip != m_mcparts->end(); ++ip ) { + double pt = ( *ip )->pt(); + int id = abs( ( *ip )->particleID().pid() ); + if ( pt > 2000 && ( id < 6 || id == 21 ) ) partons.push_back( ( *ip ) ); + } + int flavour = -999; + double dR = -1; + // double pt = -1; + std::vector::iterator ip; + for ( ip = partons.begin(); ip != partons.end(); ++ip ) { + double dR_tmp = delta_r( ( *ip )->momentum(), jet->momentum() ); + // double pt_tmp = (*ip)->pt(); + // if both are within 0.3, pick highest pt one, else pick closest + /* + if ( (dR_tmp < 0.3 && dR < 0.3 && dR != -1 )){ + if (pt_tmp > pt){ + pt = pt_tmp; + dR = dR_tmp; + flavour = (*ip)->particleID().pid(); + } + }*/ + if ( dR_tmp < 0.5 && ( dR_tmp < dR || dR == -1 ) ) { + dR = dR_tmp; + // pt = pt_tmp; + flavour = ( *ip )->particleID().pid(); + } + } + return flavour; +} + +double TupleToolMC2Jet::get_jet_width( const LHCb::Particle* jet ) { + double denom = 0.0; + double num = 0.0; + + const SmartRefVector daughters = jet->daughters(); + SmartRefVector::const_iterator ip; + + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + num += delta_r( ( *ip )->momentum(), jet->momentum() ) * ( ( *ip )->pt() ); + denom += ( *ip )->pt(); + } + double width = num / denom; + return width; +} + +double TupleToolMC2Jet::get_jet_width( const LHCb::MCParticle* jet ) { + double denom = 0.0; + double num = 0.0; + + std::vector daughters = getMCDaughters( jet ); + std::vector::iterator ip; + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + num += delta_r( ( *ip )->momentum(), jet->momentum() ) * ( ( *ip )->pt() ); + denom += ( *ip )->pt(); + } + double width = num / denom; + return width; +} + +double TupleToolMC2Jet::get_jet_charge( const LHCb::Particle* jet ) { + double denom = 0.0; + double num = 0.0; + + const SmartRefVector daughters = jet->daughters(); + SmartRefVector::const_iterator ip; + // std::vector daughters = getMCDaughters(jet); + // std::vector::iterator ip; + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + num += delta_r( ( *ip )->momentum(), jet->momentum() ) * ( ( *ip )->pt() ); + denom += ( *ip )->pt(); + } + double width = num / denom; + return width; +} +double TupleToolMC2Jet::get_jet_charge( const LHCb::MCParticle* jet ) { + double denom = 0.0; + double num = 0.0; + + std::vector daughters = getMCDaughters( jet ); + std::vector::iterator ip; + + for ( ip = daughters.begin(); ip != daughters.end(); ++ip ) { + num += ( *ip )->particleID().threeCharge() * ( ( *ip )->pt() ) / 3.0; + denom += ( *ip )->pt(); + } + double width = num / denom; + return width; +} + +std::vector TupleToolMC2Jet::getMCDaughters( const LHCb::MCParticle* part ) { + std::vector mcDauts; + if ( !part ) return mcDauts; + const SmartRefVector endverts = part->endVertices(); + for ( unsigned int k = 0; k < endverts.size(); ++k ) { + // if (endverts[k]->type() != 2) continue; + if ( !endverts[k] ) continue; + const SmartRefVector products = endverts[k]->products(); + for ( unsigned int l = 0; l < products.size(); ++l ) { + const SmartRef product = products[l]; + mcDauts.push_back( product.target() ); + } + } + return mcDauts; +} diff --git a/Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.h b/Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.h new file mode 100644 index 00000000..64b81db0 --- /dev/null +++ b/Phys/DecayTreeTupleJets/src/TupleToolMC2Jet.h @@ -0,0 +1,97 @@ +/*****************************************************************************\ +* (c) Copyright 2020 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. * +\*****************************************************************************/ +#ifndef TupleToolMC2Jet_H +#define TupleToolMC2Jet_H 1 + +// Include files +#include "DecayTreeTupleBase/TupleToolBase.h" +#include "Event/MCParticle.h" +#include "GaudiKernel/ToolHandle.h" +#include "Kernel/IDistanceCalculator.h" +#include "Kernel/IJetTagTool.h" +#include "Kernel/IParticle2MCAssociator.h" +#include "Kernel/IParticleTupleTool.h" +#include "Kernel/IVertexFit.h" +#include "Kernel/Particle2MCLinker.h" + +class IDVAlgorithm; + +class TupleToolMC2Jet : public TupleToolBase, virtual public IParticleTupleTool { +public: + /// Standard constructor + TupleToolMC2Jet( const std::string& type, const std::string& name, const IInterface* parent ); + /// Loop over the particles not in the decay and fill them into a vector + StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple& ) override; + + virtual ~TupleToolMC2Jet(); + StatusCode initialize() override; + + bool fillJet( const LHCb::MCParticle* jet, const std::string& head, Tuples::Tuple& tuple, + const std::string& suffix = "" ); + bool fillSV( const LHCb::MCParticle* jet, const std::string& head, Tuples::Tuple& tuple, + const std::string& suffix = "" ); + bool fillRecJet( const LHCb::MCParticle* jet, const LHCb::Particle* mcjet, const std::string& head, + Tuples::Tuple& tuple, const std::string& suffix ); + bool partinjet( const LHCb::Particle* j, const LHCb::Particle* part ); + double delta_r( const Gaudi::LorentzVector& a, const Gaudi::LorentzVector& b ); + double delta_r( const LHCb::Particle* j, const LHCb::Particle* part ); + double delta_r( const LHCb::MCParticle* j, const LHCb::Particle* part ); + double delta_r( const LHCb::Particle* j, std::vector parts ); + double delta_r( const LHCb::MCParticle* j, std::vector parts ); + std::vector getprotos( std::vector parts ); + std::vector gettracks( std::vector parts ); + std::vector getdecaytree( const LHCb::Particle* top ); + const LHCb::Particle* jet_deltar_truthmatch( const LHCb::MCParticle* jet, + std::vector truthjets ); + const LHCb::Particle* jet_deltar_truthmatch( const LHCb::MCParticle* jet, LHCb::Particles* truthjets ); + + int get_jet_flavour( const LHCb::MCParticle* mcjet ); + + double get_jet_width( const LHCb::Particle* jet ); + double get_jet_width( const LHCb::MCParticle* jet ); + double get_jet_charge( const LHCb::Particle* jet ); + double get_jet_charge( const LHCb::MCParticle* jet ); + + std::vector getMCDaughters( const LHCb::MCParticle* part ); + + struct pred { + bool operator()( const LHCb::MCParticle* a, const LHCb::MCParticle* b ) const { return a->pt() > b->pt(); } + }; + +protected: +private: + IDVAlgorithm* m_dva; + IVertexFit* m_fitTool; ///< The vertex fitter tool. + IDistanceCalculator* m_dstTool; ///< The distance calculator tool. + + int m_njets; + double m_deltaR; + bool m_samepv; + std::vector m_jetetarange; + std::vector m_multpts; + + LHCb::RecVertices* m_pvrs; ///< Primary vertices. + + std::string m_jetlocation; + std::string m_mcjetlocation; + std::string m_jetprefix; + std::string m_pvrLocation; + std::vector m_p2mcAssocs; + std::vector m_p2mcAssocTypes; + std::string m_MC2RecLoc; + LHCb::MCParticles* m_mcparts; + + std::string m_fitName; + std::string m_dstName; + Object2FromMC* m_mcpartLinker; +}; + +#endif // TupleToolMC2Jet_H diff --git a/Phys/JetAccessoriesMC/CMakeLists.txt b/Phys/JetAccessoriesMC/CMakeLists.txt new file mode 100644 index 00000000..d30f1984 --- /dev/null +++ b/Phys/JetAccessoriesMC/CMakeLists.txt @@ -0,0 +1,29 @@ +############################################################################### +# (c) Copyright 2000-2018 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. # +############################################################################### +################################################################################ +# Package: JetAccessoriesMC +################################################################################ +gaudi_subdir(JetAccessoriesMC) + +gaudi_depends_on_subdirs(Kernel/LHCbMath) + +find_package(FastJet) +find_package(Boost) +find_package(ROOT) +include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} + ${FASTJET_INCLUDE_DIRS}) + +gaudi_add_module(JetAccessoriesMC + src/*.cpp + INCLUDE_DIRS FastJet + LINK_LIBRARIES FastJet LHCbMathLib LoKiAlgoMCLib LoKiPhysMCLib) + + diff --git a/Phys/JetAccessoriesMC/src/McJetBuilder.cpp b/Phys/JetAccessoriesMC/src/McJetBuilder.cpp new file mode 100644 index 00000000..da48163d --- /dev/null +++ b/Phys/JetAccessoriesMC/src/McJetBuilder.cpp @@ -0,0 +1,166 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +// Local. +#include "McJetBuilder.h" + +//----------------------------------------------------------------------------- +// Implementation file for class : McJetBuilder +// +// 2016-05-26 : Cedric Potterat and Philip Ilten +//----------------------------------------------------------------------------- + +// Declare the algorithm factory. +DECLARE_COMPONENT( McJetBuilder ) + +//============================================================================= +// Constructor. +//============================================================================= +McJetBuilder::McJetBuilder( const string& name, ISvcLocator* svc ) : GaudiHistoAlg( name, svc ) { + // Declare the input/output properties. + declareProperty( "Inputs", m_inLocs, "Input locations of MCParticles to use." ); + declareProperty( "Output", m_outLoc = "Phys/JB/MCParticles", "JB output MCParticle location." ); + + // Declare the jet properties. + declareProperty( "JetPid", m_jetPid = 98, "Particle ID to assign the jets." ); + declareProperty( "JetPtMin", m_jetPtMin = 5 * Gaudi::Units::GeV, "Minimum jet pT to build with FastJet." ); + declareProperty( "JetR", m_jetR = 0.5, "Jet radius parameter to use with FastJet." ); + declareProperty( "ChrVrt", m_chrVrt = false, "If true, associate charged particles to a primary vertex." ); + declareProperty( "NeuVrt", m_neuVrt = false, "If true, associate neutral particles to a primary vertex." ); + declareProperty( "JetSort", m_jetSort = 2, "Jet sorting method: 1 E, 2 pT, or 3 y." ); + + // Declare the FastJet properties. + declareProperty( "FjAlg", m_fjAlg = 2, + "FastJet finder to use: 0 kt, 1 cambridge, 2 anti-kt, ...; " + "see fasjet::JetAlgorithm for more options." ); + declareProperty( "FjScheme", m_fjScheme = 0, + "FastJet recombination scheme: 0 E, 1 pT, 2 pT^2, ...; see " + "fastjet::RecombinationScheme for more options." ); + declareProperty( "FjStrategy", m_fjStrategy = 1, + "FastJet clustering strategy: 0 N3Dumb, 1 Best, 2 NlnN, ...; " + "see fastjet::Strategy for more options." ); +} + +//============================================================================= +// Initialize. +//============================================================================= +StatusCode McJetBuilder::initialize() { + m_def = JetDefinition( static_cast( m_fjAlg ), m_jetR, static_cast( m_fjScheme ), + static_cast( m_fjStrategy ) ); + if ( m_jetSort == 1 ) + m_sort = &sorted_by_E; + else if ( m_jetSort == 2 ) + m_sort = &sorted_by_pt; + else if ( m_jetSort == 3 ) + m_sort = &sorted_by_rapidity; + else + m_sort = &sorted_by_pt; + // Determine the output location base. + m_outPre = m_outLoc; + DaVinci::StringUtils::removeEnding( m_outPre, "/" ); + return StatusCode::SUCCESS; +} + +//============================================================================= +// Execute. +//============================================================================= +StatusCode McJetBuilder::execute() { + // Create the output. + m_prts = new MCParticles(); + m_vrts = new MCVertices(); + put( m_prts, m_outLoc ); + put( m_vrts, m_outPre + "/MCVertices" ); + + // Assign the input Particles by PV (if requested). + vector cntrPrts; + VrtsPrts vrtsPrts; + for ( vector::iterator inLoc = m_inLocs.begin(); inLoc != m_inLocs.end(); ++inLoc ) { + MCParticles* prts = getIfExists( *inLoc ); + if ( !prts ) { + warning() << "Could not retrieve MCParticles from " << *inLoc << endmsg; + continue; + } + for ( MCParticles::iterator prt = prts->begin(); prt != prts->end(); ++prt ) { + const MCVertex* vrt = primary( *prt ); + int q = ( *prt )->particleID().threeCharge(); + if ( !vrt || ( !m_chrVrt && q != 0 ) || ( !m_neuVrt && q == 0 ) ) { + cntrPrts.push_back( *prt ); + continue; + } + VrtsPrts::iterator vrtPrt = vrtsPrts.find( vrt ); + if ( vrtPrt == vrtsPrts.end() ) + vrtsPrts[vrt] = vector( 1, *prt ); + else + vrtPrt->second.push_back( *prt ); + } + } + + // Build the jets. + if ( m_chrVrt || m_neuVrt ) { + for ( VrtsPrts::iterator vrtPrt = vrtsPrts.begin(); vrtPrt != vrtsPrts.end(); ++vrtPrt ) { + vrtPrt->second.insert( vrtPrt->second.end(), cntrPrts.begin(), cntrPrts.end() ); + build( &vrtPrt->second, vrtPrt->first ); + } + } else + build( &cntrPrts, 0 ); + setFilterPassed( true ); + return StatusCode::SUCCESS; +} + +//============================================================================= +// Finalize. +//============================================================================= +StatusCode McJetBuilder::finalize() { return StatusCode::SUCCESS; } + +//============================================================================= +// Additional methods. +//============================================================================= +// Build jets from #prts and add to the TES. +void McJetBuilder::build( const vector* prts, const MCVertex* vrt ) { + // Run FastJet. + vector fjps; + for ( unsigned int iPrt = 0; iPrt < prts->size(); ++iPrt ) { + const Gaudi::LorentzVector& p = prts->at( iPrt )->momentum(); + fjps.push_back( PseudoJet( p.Px(), p.Py(), p.Pz(), p.E() ) ); + fjps.back().set_user_index( iPrt ); + } + ClusterSequence clst( fjps, m_def ); + vector jets = ( *m_sort )( clst.inclusive_jets( m_jetPtMin ) ); + + // Create the MCParticle jets and insert into output. + for ( vector::iterator jet = jets.begin(); jet != jets.end(); ++jet ) { + MCParticle* prt = new MCParticle(); + MCVertex* end = new MCVertex(); + prt->setMomentum( Gaudi::LorentzVector( jet->px(), jet->py(), jet->pz(), jet->e() ) ); + prt->setParticleID( ParticleID( m_jetPid ) ); + prt->addToEndVertices( end ); + if ( vrt ) prt->setOriginVertex( vrt ); + if ( vrt ) + end->setPosition( vrt->position() ); + else + end->setPosition( Gaudi::XYZPoint( 0, 0, 0 ) ); + end->setType( MCVertex::Unknown ); + vector dtrs = jet->constituents(); + for ( vector::iterator dtr = dtrs.begin(); dtr != dtrs.end(); ++dtr ) + end->addToProducts( prts->at( dtr->user_index() ) ); + m_prts->insert( prt ); + m_vrts->insert( end ); + } +} + +// Return the primary MCVertex for an MCParticle. +const MCVertex* McJetBuilder::primary( const MCParticle* prt ) { + const MCVertex* vrt = prt->originVertex(); + if ( !vrt ) return 0; + if ( vrt->isPrimary() ) return vrt; + if ( vrt->type() < 1 || vrt->type() > 4 ) return 0; + if ( !vrt->mother() ) return 0; + return primary( vrt->mother() ); +} diff --git a/Phys/JetAccessoriesMC/src/McJetBuilder.h b/Phys/JetAccessoriesMC/src/McJetBuilder.h new file mode 100644 index 00000000..a4e06a17 --- /dev/null +++ b/Phys/JetAccessoriesMC/src/McJetBuilder.h @@ -0,0 +1,118 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +#ifndef MCJETBUILDER_H +#define MCJETBUILDER_H 1 + +// STL. +#include +#include + +// Gaudi. +#include "GaudiAlg/GaudiHistoAlg.h" + +// Event. +#include "Event/MCParticle.h" + +// Tools. +#include "Kernel/DaVinciStringUtils.h" + +// FastJet. +#include "fastjet/ClusterSequence.hh" +#include "fastjet/config.h" + +using namespace std; +using namespace fastjet; +using namespace LHCb; + +/** + * Jet building (JB) algorithm class for use with MCParticles. + * + * JB takes MCParticle inputs and clusters them into jets using the + * FastJet package. + * + * Jets can be built per primary vertex or inclusively using the + * 'ChrVrt' and 'NeuVrt' flags. If both are false, jets are built + * inclusively. If 'ChrVrt' is true, charged particles are associated + * to PVs while if 'NeuVrt' is true, neutral particles are associated + * to PVs. Particles with no PV are associated to all PVs. The jets + * are built using the input for each PV and the PV location is set as + * the reference point of the jet. Note that when building per PV, any + * particles without PVs are double counted, when considering jets + * from all PVs. + * + * @class McJetBuilder + * @file McJetBuilder.h + * @author Cedric Potterat and Philip Ilten + * @date 2016-05-26 + */ +class McJetBuilder : public GaudiHistoAlg { +public: + /// Constructor. + McJetBuilder( const string& name, ISvcLocator* svc ); + StatusCode initialize() override; ///< Initialize. + StatusCode execute() override; ///< Execute. + StatusCode finalize() override; ///< Finalize. + +private: + /// Definition of map relating MCVertices to MCParticles. + typedef unordered_map> VrtsPrts; + + // Additional methods. + /// Build jets from #prts and add to the TES. + void build( const vector* prts, const MCVertex* vrt ); + /// Associate an MCParticle with a primary vertex. + const MCVertex* primary( const MCParticle* prt ); + + // Input/output property members. + /// Input locations of MCParticles to use. + vector m_inLocs; + /// JB output MCParticle location. + string m_outLoc; + /// JB output prefix for non-MCParticle locations (determined from m_outLoc). + string m_outPre; + + // Jet property members. + /// Particle ID to assign the jets. + int m_jetPid; + /// Minimum jet pT to build with FastJet. + double m_jetPtMin; + /// Jet radius parameter to use with FastJet. + double m_jetR; + /// If true, associate charged particles to a primary vertex. + bool m_chrVrt; + /// If true, associate neutral particles to a primary vertex. + bool m_neuVrt; + /// Jet sorting method: 1 E, 2 pT, or 3 y. + int m_jetSort; + + // FastJet property members. + /// FastJet finder to use: 0 kt, 1 cambridge, 2 anti-kt, ...; see + /// fasjet::JetAlgorithm for more options. + int m_fjAlg; + /// FastJet recombination scheme: 0 E, 1 pT, 2 pT^2, ...; see + /// fastjet::RecombinationScheme for more options. + int m_fjScheme; + /// FastJet clustering strategy: 0 N3Dumb, 1 Best, 2 NlnN, ...; see + /// fastjet::Strategy for more options. + int m_fjStrategy; + + // Additional members (not properties). + /// The FastJet jet definition. + JetDefinition m_def; + /// Pointer to the jet sorting function. + vector ( *m_sort )( const vector& jets ); + /// Output MCParticle container. + MCParticles* m_prts; + /// Output MCVertex container. + MCVertices* m_vrts; +}; + +#endif // MCJETBUILDER_H diff --git a/Phys/JetAccessoriesMC/src/McParticleFlow.cpp b/Phys/JetAccessoriesMC/src/McParticleFlow.cpp new file mode 100644 index 00000000..9d22eddf --- /dev/null +++ b/Phys/JetAccessoriesMC/src/McParticleFlow.cpp @@ -0,0 +1,245 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +// Local. +#include "McParticleFlow.h" + +//----------------------------------------------------------------------------- +// Implementation file for class : McParticleFlow +// +// 2016-05-25 : Cedric Potterat and Philip Ilten +//----------------------------------------------------------------------------- + +// Declare the algorithm factory. +DECLARE_COMPONENT( McParticleFlow ) + +//============================================================================= +// Constructor. +//============================================================================= +McParticleFlow::McParticleFlow( const string& name, ISvcLocator* svc ) : GaudiHistoAlg( name, svc ) { + // Declare the input/output properties. + declareProperty( "Inputs", m_inLocs, + "PF inputs of the form [, , " + "]." ); + declareProperty( "Output", m_outLoc = "Phys/PF/MCParticles", "PF output MCParticle location." ); +} + +//============================================================================= +// Initialize. +//============================================================================= +StatusCode McParticleFlow::initialize() { + StatusCode sc = GaudiHistoAlg::initialize(); + if ( sc.isFailure() ) { return sc; } + // Create the inputs. + m_inPrts.clear(); + unordered_set pidsBan, pidsPrt; + for ( unsigned int inLoc = 0; inLoc < m_inLocs.size(); ++inLoc ) { + Input in( &inLoc, &m_inLocs[inLoc], &pidsBan, &pidsPrt ); + if ( !in.valid ) + warning() << in.warn << endmsg; + else if ( in.name == "MCParticle" ) + m_inPrts.push_back( in ); + else if ( in.name == "PID" ) + ; + else + warning() << "Skipping input element " << inLoc << " with unknown class '" << in.name << "'." << endmsg; + } + + // Print the configuration, if requested. + verbose() << "\n" + << "*-------------------------------------------------------*\n" + << "* McParticleFlow Configuration *\n" + << "*-------------------------------------------------------*\n" + << "Inputs:\n" + << setw( 4 ) << "idx" << setw( 15 ) << "class name" << setw( 16 ) << "object type" << setw( 40 ) + << "location" + << "\n"; + for ( vector::iterator inPrt = m_inPrts.begin(); inPrt != m_inPrts.end(); ++inPrt ) inPrt->print( verbose() ); + verbose() << endmsg; + return StatusCode::SUCCESS; +} + +//============================================================================= +// Execute. +//============================================================================= +StatusCode McParticleFlow::execute() { + // Clear the event and create the output. + double energy( 0 ); + m_used.clear(); + m_prts = new MCParticles(); + put( m_prts, m_outLoc ); + + // Add the inputs. + vector::iterator inPrt( m_inPrts.begin() ); + for ( unsigned int inLoc = 0; inLoc < m_inLocs.size(); ++inLoc ) { + if ( inPrt == m_inPrts.end() || inLoc != inPrt->index ) continue; + MCParticles* prts = getIfExists( inPrt->loc ); + if ( !prts ) + warning() << "Could not retrieve " << inPrt->name << "s from " << inPrt->loc << endmsg; + else { + m_save.clear(); + int key( 0 ); + for ( MCParticles::iterator prt = prts->begin(); prt != prts->end(); ++prt ) { + add( *prt, *inPrt, key ); + ++key; + } + for ( MCParticles::iterator prt = prts->begin(); prt != prts->end(); ++prt ) + if ( m_save.find( *prt ) != m_save.end() ) { + m_prts->insert( *prt ); + energy += ( *prt )->momentum().e(); + } + } + ++inPrt; + } + verbose() << "Summed energy [GeV]: " << energy / Gaudi::Units::GeV << endmsg; + setFilterPassed( true ); + return StatusCode::SUCCESS; +} + +//============================================================================= +// Input structure class for PF. +//============================================================================= +// Constructor. +McParticleFlow::Input::Input( const unsigned int* idx, const vector* prp, unordered_set* idb, + unordered_set* idp ) + : valid( false ), ban( false ), prt( false ) { + if ( !idx ) { + warn += "Invalid pointer to index."; + return; + } + warn = "Skipping input element " + to_string( *idx ) + ", "; + if ( !prp ) { + warn += "invalid pointer to input list."; + return; + } + if ( prp->size() != 3 ) { + warn += "input list size " + to_string( prp->size() ) + ", must be 3."; + return; + } + + // Set the members. + string s0( prp->at( 0 ) ), s1( prp->at( 1 ) ), s2( prp->at( 2 ) ); + if ( s2.empty() ) { + warn += "empty location."; + return; + } + if ( s1 != "ban" && s1 != "particle" && s1 != "daughters" ) { + warn += "incompatible object type, " + s1 + " for class " + s0 + "."; + return; + } else if ( s0 == "MCParticle" ) { + ban = ( s1 == "ban" ); + prt = ( s1 == "particle" ); + if ( idb ) pidsBan = *idb; + if ( idp ) pidsPrt = *idp; + } else if ( s0 == "PID" ) { + int pid; + stringstream ss( s2 ); + while ( ss >> pid ) { + if ( s1 == "ban" && idb ) + idb->insert( pid ); + else if ( s1 == "particle" && idp ) + idp->insert( pid ); + while ( ss.peek() == ',' || ss.peek() == ',' ) ss.ignore(); + } + } else + return; + name = s0; + type = s1; + loc = s2; + index = *idx; + valid = true; +} + +// Print the input configuration to #msg. +void McParticleFlow::Input::print( MsgStream& msg, bool idx ) { + if ( idx ) { + msg << setw( 4 ) << index << setw( 15 ) << name << setw( 16 ) << type << setw( 40 ) << loc << "\n" + << setw( 19 ) << "bans:"; + int len( 0 ); + for ( unordered_set::iterator pid = pidsBan.begin(); pid != pidsBan.end(); ++pid ) { + int n( log10( abs( *pid ) ) + 2 + ( *pid < 0 ? 1 : 0 ) ); + if ( len + n > 59 ) { + msg << "\n" << setw( 19 ) << " "; + len = n; + } else { + msg << " " << *pid; + len += n; + } + } + len = 0; + msg << "\n" << setw( 19 ) << "prts:"; + for ( unordered_set::iterator pid = pidsPrt.begin(); pid != pidsPrt.end(); ++pid ) { + int n( log10( abs( *pid ) ) + 2 + ( *pid < 0 ? 1 : 0 ) ); + if ( len + n > 59 ) { + msg << "\n" << setw( 19 ) << " "; + len = n; + } else { + msg << " " << *pid; + len += n; + } + } + } else + msg << setw( 4 ) << " " << setw( 15 ) << name << setw( 16 ) << type << setw( 40 ) << loc << "\n"; +} + +//============================================================================= +// Additional methods. +//============================================================================= +// Add an MCParticle and its daughters to the PF output MCParticles. +void McParticleFlow::add( const MCParticle* prt, const Input& in, int key ) { + if ( !primary( prt ) ) return; + if ( prt->mother() && prt->mother()->key() > key ) return; + bool stable( false ), banned( false ), used( false ); + vector> dtrs; + status( prt, in, dtrs, stable, banned, used ); + if ( used && !banned ) return; + for ( vector>::iterator dtr = dtrs.begin(); dtr != dtrs.end(); ++dtr ) { + m_used.insert( dtr->first ); + if ( dtr->second ) m_save.insert( dtr->first ); + } +} + +// Recursively determine the status of an MCParticle decay tree. +void McParticleFlow::status( const MCParticle* prt, const Input& in, vector>& prts, + bool& stable, bool& banned, bool& used ) { + int pid( prt->particleID().pid() ); + stable = in.prt || in.pidsPrt.find( pid ) != in.pidsPrt.end(); + banned = banned || in.ban || in.pidsBan.find( pid ) != in.pidsBan.end(); + used = used || m_used.find( prt ) != m_used.end(); + + // Add the daughters from the decay tree. + const SmartRefVector vrts = prt->endVertices(); + bool material( false ), decay( false ); + for ( SmartRefVector::const_iterator ivrt = vrts.begin(); ivrt != vrts.end(); ++ivrt ) { + const MCVertex* vrt = ivrt->target(); + if ( vrt->type() < 1 || vrt->type() > 4 ) + material = true; + else if ( vrt->type() == 2 || vrt->type() == 3 ) { + decay = true; + const SmartRefVector dtrs = vrt->products(); + for ( SmartRefVector::const_iterator iDtr = dtrs.begin(); iDtr != dtrs.end(); ++iDtr ) { + bool dtrStable( false ), dtrBanned( stable || banned ); + status( iDtr->target(), in, prts, dtrStable, dtrBanned, used ); + } + } + } + stable = stable || ( vrts.size() == 0 || ( material && !decay ) ); + prts.push_back( make_pair( prt, stable && !banned && !used ) ); +} + +// Check if a particle is from a collision. +bool McParticleFlow::primary( const MCParticle* prt ) { + const MCVertex* vrt = prt->originVertex(); + if ( !vrt ) return false; + if ( vrt->isPrimary() ) return true; + if ( vrt->type() < 1 || vrt->type() > 4 ) return false; + if ( !vrt->mother() ) return false; + return primary( vrt->mother() ); +} diff --git a/Phys/JetAccessoriesMC/src/McParticleFlow.h b/Phys/JetAccessoriesMC/src/McParticleFlow.h new file mode 100644 index 00000000..73f0c4aa --- /dev/null +++ b/Phys/JetAccessoriesMC/src/McParticleFlow.h @@ -0,0 +1,121 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +#ifndef MCPARTICLEFLOW_H +#define MCPARTICLEFLOW_H 1 + +// STL. +#include +#include + +// Gaudi. +#include "GaudiAlg/GaudiHistoAlg.h" + +// Event. +#include "Event/MCParticle.h" + +using namespace std; +using namespace LHCb; + +/** + * Particle flow (PF) algorithm class for use with MCParticles. + * + * PF takes inputs and creates a common output of MCParticles, + * ensuring only stable MCParticles from collisions (not material + * interactions) with no double counting; if a particle is designated + * as stable, its daughters are not included in the output. + * + * The PF algorithm itself does not filter input; the passed inputs + * must already be filtered. Two classes of inputs can be passed with + * class names 'MCParticle' and 'PID'. Inputs are set via the 'Inputs' + * property which must be of the form [[, , + * ], ...] where all three arguments for each input are + * strings. The object type can be 'ban', 'particle', or + * 'daughters'. If 'ban', the MCParticle and all its daughters are + * banned from the PF output. If 'particle', the MCParticle is treated + * as stable and its daughters are not written. Finally, if + * 'daughters', only final state daughters are written. + * + * For inputs of class 'PID' the provided location should be a string + * of comma separated PDG IDs, e.g. '12,-12,14,-14,16,-16'. The 'ban' + * or 'particle' rules from a 'PID' input apply to all 'MCParticle' + * inputs that follow. For example, if the first input is ['PID', + * 'ban', '12,-12,14,-14,16,-16'], then neutrinos will be banned from + * all remaining inputs. The 'PID' rules are cumulative. Note that a + * 'PID' input of object type 'daughters' has no effect. + * + * @class McParticleFlow + * @file McParticleFlow.h + * @author Cedric Potterat and Philip Ilten + * @date 2016-05-25 + */ +class McParticleFlow : public GaudiHistoAlg { +public: + /// Constructor. + McParticleFlow( const string& name, ISvcLocator* svc ); + StatusCode initialize() override; ///< Initialize. + StatusCode execute() override; ///< Execute. + +private: + /** + * Input structure class for PF. + * + * Used to parse the input lists passed via #m_inLocs. + */ + class Input { + public: + /// Constructor. + Input( const unsigned int* idx = 0, const vector* prp = 0, unordered_set* idb = 0, + unordered_set* idp = 0 ); + /// Print the input configuration to #out. + inline void print( MsgStream& msg, bool idx = true ); + + // Members. + string warn; ///< Any warnings that may have been generated. + string name; ///< The class name of objects from this input. + string type; ///< The object type for this input. + string loc; ///< The TES location for this input. + bool valid; ///< Flag if input is valid. + bool ban; ///< Flag if objects from this input should be banned. + bool prt; ///< Flag if MCParticle should be written as a particle. + unsigned int index; ///< Index for this input. + unordered_set pidsBan; ///< Set of PIDs to ban. + unordered_set pidsPrt; ///< Set of PIDs to treat as particles. + }; + + // Additional methods. + /// Add an MCParticle and its daughters to the PF output MCParticles. + void add( const MCParticle* prt, const Input& in, int key ); + /** + * Recursively determine the status of an MCParticle decay tree. + * + * #used is set to true if any particle in the decay tree has been + * used. #prts are all particles from the decay tree (including the + * mother) with a flag whether the particle should be saved. + */ + void status( const MCParticle* mom, const Input& in, vector>& prts, bool& stable, + bool& banned, bool& used ); + /// Check if a particle is from a collision. + bool primary( const MCParticle* prt ); + + // Input/output property members. + /// PF inputs of the form [, , ]. + vector> m_inLocs; + /// PF output Particle location. + string m_outLoc; + + // Additional members (not properties). + MCParticles* m_prts; ///< Output MCParticle container. + vector m_inPrts; ///< Vector of MCParticle inputs. + unordered_set m_used; ///< Set of used MCParticles. + unordered_set m_save; ///< Set of MCParticles to save. +}; + +#endif // MCPARTICLEFLOW_H -- GitLab From 43d067962b1dc4de7cf2eb83a93d84f529daca37 Mon Sep 17 00:00:00 2001 From: Ross John Hunter Date: Thu, 16 Sep 2021 17:17:43 +0200 Subject: [PATCH 51/82] Make MCTupleToolTOS compatible with HLT2 --- Phys/DecayTreeTupleMC/CMakeLists.txt | 4 +- Phys/DecayTreeTupleMC/src/MCTupleToolTOS.cpp | 353 ------------------ Phys/DecayTreeTupleMC/src/MCTupleToolTOS.h | 75 ---- .../src/MCTupleToolTOSBase.cpp | 142 +++++++ .../DecayTreeTupleMC/src/MCTupleToolTOSBase.h | 79 ++++ .../src/MCTupleToolTOSHLT1.cpp | 167 +++++++++ .../DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h | 31 ++ .../src/MCTupleToolTOSHLT2.cpp | 188 ++++++++++ .../DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h | 33 ++ 9 files changed, 643 insertions(+), 429 deletions(-) delete mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOS.cpp delete mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOS.h create mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp create mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h create mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp create mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h create mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp create mode 100644 Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h diff --git a/Phys/DecayTreeTupleMC/CMakeLists.txt b/Phys/DecayTreeTupleMC/CMakeLists.txt index 750d1280..fa230c06 100644 --- a/Phys/DecayTreeTupleMC/CMakeLists.txt +++ b/Phys/DecayTreeTupleMC/CMakeLists.txt @@ -26,7 +26,9 @@ gaudi_add_module(DecayTreeTupleMC src/MCTupleToolPrompt.cpp src/MCTupleToolReconstructed.cpp src/MCTupleToolRedecay.cpp - src/MCTupleToolTOS.cpp + src/MCTupleToolTOSBase.cpp + src/MCTupleToolTOSHLT1.cpp + src/MCTupleToolTOSHLT2.cpp src/TupleToolMCBackgroundInfo.cpp src/TupleToolMCPVAssociation.cpp src/TupleToolMCTruth.cpp diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOS.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOS.cpp deleted file mode 100644 index ec402a29..00000000 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOS.cpp +++ /dev/null @@ -1,353 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -// Include files -#include "boost/regex.hpp" -#include "gsl/gsl_sys.h" - -// local -#include "Event/MCParticle.h" -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "MCTupleToolTOS.h" - -using namespace LHCb; -//----------------------------------------------------------------------------- -// Implementation file for class : MCTupleToolTOS -// -// 2020-03-03 : Ross Hunter -//----------------------------------------------------------------------------- - -// Declaration of the Tool Factory -DECLARE_COMPONENT( MCTupleToolTOS ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -MCTupleToolTOS::MCTupleToolTOS( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); -} - -//============================================================================= -// initialize -//============================================================================= -StatusCode MCTupleToolTOS::initialize() { - if ( !TupleToolBase::initialize() ) return StatusCode::FAILURE; - - if ( !m_triggerList.empty() ) compileTriggerLineList( m_triggerList ); - - if ( m_level.empty() ) { - error() << "Please specify the trigger level." << endmsg; - return StatusCode::FAILURE; - } - - return StatusCode::SUCCESS; -} - -bool MCTupleToolTOS::fetchLHCbIDsFromMCParticle( const LHCb::MCParticle* mcp, const LHCb::LinksByKey* mc2IdLink, - std::map& map_of_ID_weights ) { - // Recursive function to iterate over each child of the MCParticle and collect the LHCbIDs in map - - if ( !mcp->fromSignal() ) { - warning() << "MCParticle with ID " << mcp->particleID() << "is not fromSignal()!" << endmsg; - } - - // Add this track's LHCbIDs to the map - std::map this_track_map_of_ids{}; - mc2IdLink->applyToAllLinks( [&this_track_map_of_ids, &mcp]( unsigned int id, int mcPartKey, float weight ) { - if ( mcPartKey == mcp->key() ) { this_track_map_of_ids.insert( {LHCb::LHCbID( id ), weight} ); } - } ); - [[maybe_unused]] size_t this_track_size{this_track_map_of_ids.size()}; - [[maybe_unused]] size_t current_map_size{map_of_ID_weights.size()}; - if ( this_track_map_of_ids.size() > 0 ) { - map_of_ID_weights.merge( this_track_map_of_ids ); - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Added hits from MCP with ID " << mcp->particleID() << ". The map of IDs container now has size " - << map_of_ID_weights.size() << endmsg; - } - if ( map_of_ID_weights.size() != ( current_map_size + this_track_size ) and msgLevel( MSG::DEBUG ) ) { - debug() << "The map of IDs container should have had size " << ( current_map_size + this_track_size ) - << " but has size " << map_of_ID_weights.size() << ". Some hits must have been duplicated." << endmsg; - } - } else { - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "This track has no LHCbIDs associated with it. Not adding to the map." << endmsg; - } - } - - // Now iterate through children and add their LHCbIDs to the map - // Use the MCParticle::endVertices method to get vertices on this track. Those that are are isDecay() are decay - // vertices - // TODO should we consider other types of vertex? I guess they are just radiating photons, material interactions etc. - // Use fromSignal() to give us a hint, but this will only work for EvtGen decays - const auto& endVertices = mcp->endVertices(); - if ( endVertices.size() != 1 and msgLevel( MSG::DEBUG ) ) { - debug() << "EndVertex container has size " << endVertices.size() << endmsg; - } - - for ( SmartRefVector::const_iterator vtx_iter = endVertices.begin(); vtx_iter != endVertices.end(); - ++vtx_iter ) { - const LHCb::MCVertex& decayVertex = *( vtx_iter->target() ); - if ( msgLevel( MSG::DEBUG ) ) { debug() << "This vertex is a decay vertex? " << decayVertex.isDecay() << endmsg; } - if ( decayVertex.isDecay() ) { - const auto& decayProducts = decayVertex.products(); - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Found a isDecay() vertex with products container with size " << decayProducts.size() << endmsg; - } - for ( SmartRefVector::const_iterator part_iter = decayProducts.begin(); - part_iter != decayProducts.end(); ++part_iter ) { - const LHCb::MCParticle* childParticle = part_iter->target(); - if ( !childParticle->fromSignal() ) { warning() << "This particle is not fromSignal" << endmsg; } - if ( !fetchLHCbIDsFromMCParticle( childParticle, mc2IdLink, map_of_ID_weights ) ) { return false; } - } - } else { - if ( msgLevel( MSG::DEBUG ) ) { debug() << "This is not a decay vertex. Going no further." << endmsg; } - continue; - } - } - - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Finished collecting IDs for MCParticle with ID " << mcp->particleID() << endmsg; - } - return true; -} - -std::map MCTupleToolTOS::getCandidateLHCbMap( const LHCb::HltObjectSummary& topLevelSummary ) { - - const SmartRefVector& sub = topLevelSummary.substructure(); - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Attempting to break down the selection summary into its subsummaries" << endmsg; - debug() << "There are " << sub.size() << " HltObjectSummary objects/Trigger Candidates in the topLevelSummary" - << endmsg; - } - std::map idsByTriggerCandidateMap{}; - - if ( topLevelSummary.summarizedObjectCLID() == 1 ) { - // A selection summary, made up of tracks and vertices - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Found a selection summary. Printing..." << endmsg; - std::cout << topLevelSummary << std::endl; - } - - int iCand = 0; - for ( SmartRefVector::const_iterator subsummary_iter = sub.begin(); - subsummary_iter != sub.end(); ++subsummary_iter ) { - const LHCb::HltObjectSummary& subsummary = *( subsummary_iter->target() ); - IDvec thisCandIDVec{}; - fetchLHCbIDsFromHOS( subsummary, thisCandIDVec ); - auto result = idsByTriggerCandidateMap.insert( std::pair( thisCandIDVec, iCand ) ); - if ( !result.second ) { warning() << "Insertion failed. Seems this candidate is already there." << endmsg; } - iCand++; - } - } else { - warning() << "Not a selection summary. Dont know what to do with this object with summarizedObjectCLID " - << topLevelSummary.summarizedObjectCLID() << endmsg; - } - return idsByTriggerCandidateMap; -} - -bool MCTupleToolTOS::fetchLHCbIDsFromHOS( const LHCb::HltObjectSummary& hltObjectSummary, IDvec& bucket_of_ids ) { - // Recursive function to iterate over each track of the trigger candidate and collect the LHCbIDs in bucket_of_ids - - const SmartRefVector& sub = hltObjectSummary.substructure(); - - if ( hltObjectSummary.summarizedObjectCLID() == 10030 ) { - // Vertex-like summary -> should be made of tracks and further vertices -> pass on the substructure... - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Found a vertex-like object with IDs. Passing on the substructure..." << endmsg; - debug() << "This vertex has " << sub.size() << " objects within it" << endmsg; - } - bool isEmptySummary = true; - for ( SmartRefVector::const_iterator subsummary_iter = sub.begin(); - subsummary_iter != sub.end(); ++subsummary_iter ) { - const LHCb::HltObjectSummary& subsummary = *( subsummary_iter->target() ); - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "This sub-object has CLID " << subsummary.summarizedObjectCLID() << endmsg; - } - fetchLHCbIDsFromHOS( subsummary, bucket_of_ids ); - isEmptySummary = false; - } - if ( isEmptySummary ) { return false; } - } else if ( hltObjectSummary.summarizedObjectCLID() == 10010 ) { - // Track-like -> add to the bucket. - if ( msgLevel( MSG::DEBUG ) ) { debug() << "Found a track-like object with IDs. Adding to bucket..." << endmsg; } - bucket_of_ids.insert( bucket_of_ids.end(), hltObjectSummary.lhcbIDs().begin(), hltObjectSummary.lhcbIDs().end() ); - - // NOTE it seems that the lhcbIDs() and lhcbIDsFlattened() method do the same thing, or the case where they differ - // is unknown to me so we'll put this to catch when this case arises: - assert( hltObjectSummary.lhcbIDs() == hltObjectSummary.lhcbIDsFlattened() ); - } else { - warning() << "Dont know how to handle object with summarizedObjectCLID " << hltObjectSummary.summarizedObjectCLID() - << endmsg; - return false; - } - return true; -} - -//============================================================================= -// Fill -//============================================================================= -StatusCode MCTupleToolTOS::fill( const LHCb::MCParticle*, const LHCb::MCParticle* mcp, const std::string& head, - Tuples::Tuple& tuple ) { - const std::string prefix = fullName( head ); - - // TODO need to figure out why it looks like this is all getting called twice. - - std::vector names = std::vector( 0 ); - if ( m_level == "Hlt1" ) { - names = m_hlt1; - } else if ( m_level == "Hlt2" ) { - names = m_hlt2; - } else { - return StatusCode::FAILURE; - } - - if ( mcp != 0 ) { - - // Get the LHCbIDs from the MCParticle - LHCb::LinksByKey* mcp_id_link = m_mc2IdLinkDh.get(); - if ( !mcp_id_link ) { - // Should always be available... - return Error( "Cannot load the MC 2 ID links Location object", StatusCode::SUCCESS ); - } - - // TODO is weight always =1? If so a simpler vector will suffice. - std::map mcp_ID_map{}; - if ( !fetchLHCbIDsFromMCParticle( mcp, mcp_id_link, mcp_ID_map ) ) { - fatal() << "Failed to get all the IDs from the MCParticle." << endmsg; - } else { - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Fetched all the IDs from the MCParticle. Printing..." << endmsg; - std::cout << mcp_ID_map << std::endl; - } - } - - // Open up the SelReports - LHCb::HltSelReports* selReports = m_hltSelReportDh.get(); - if ( !selReports ) { - // Should always be available... - return Error( "Cannot load the Hlt SelReport Location object", StatusCode::SUCCESS ); - } - - for ( std::vector::const_iterator n = names.begin(); n != names.end(); ++n ) { - if ( msgLevel( MSG::DEBUG ) ) { debug() << "Trying to fill " << ( *n ) << endmsg; } - // individual Hlt trigger lines - bool tos_on_this_line{false}; - std::vector mc_match_fracs, reco_match_fracs, mc_unmatch_fracs; - - // Then loop over the sel reports - for ( LHCb::HltSelReports::Container::const_iterator it = selReports->begin(); it != selReports->end(); ++it ) { - if ( ( it->first == *n ) ) { - - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "The line " << *n << " fired on the event with this candidate in it." << endmsg; - debug() << "Getting the LHCbIDs in a map, one vector for each trigger candidate." << endmsg; - } - - LHCb::HltObjectSummary hltObjectSummary = it->second; - auto idsByCandidateMap = getCandidateLHCbMap( hltObjectSummary ); - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Found " << idsByCandidateMap.size() << " candidates that fired the trigger" << endmsg; - } - - for ( auto const& [trig_cand_IDs, i] : idsByCandidateMap ) { - - float n_matching_IDs{0.f}; - for ( const auto& id : trig_cand_IDs ) { - const auto iter = mcp_ID_map.find( id ); - if ( iter != mcp_ID_map.end() ) { n_matching_IDs += iter->second; } - } - - float mc_match_frac{1.f}; - float reco_match_frac{1.f}; - float mc_unmatch_frac{0.f}; - - mc_match_frac = n_matching_IDs / mcp_ID_map.size(); - reco_match_frac = n_matching_IDs / trig_cand_IDs.size(); - mc_unmatch_frac = 1.f - mc_match_frac; - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Fraction of MCP hits that overlap with candidate " << i << " is " - << std::to_string( mc_match_frac ) << endmsg; - debug() << "Fraction of trig candidate " << i << " that overlap with the MCP is (TOS) " - << std::to_string( reco_match_frac ) << endmsg; - debug() << "Fraction of MCP hits that dont overlap with candidate " << i << " is " - << std::to_string( mc_unmatch_frac ) << endmsg; - } - assert( reco_match_frac <= 1.f ); - tos_on_this_line |= reco_match_frac >= tos_threshold ? true : false; - - mc_match_fracs.emplace_back( mc_match_frac ); - reco_match_fracs.emplace_back( reco_match_frac ); - mc_unmatch_fracs.emplace_back( mc_unmatch_frac ); - } - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "For trigger with name = " << it->first << ", TOS decision = " << tos_on_this_line - << " on MCParticle with ID " << mcp->particleID() << endmsg; - } - } - } - - if ( !tuple->column( prefix + "_" + *n + "TOS", tos_on_this_line ) ) { return StatusCode::FAILURE; } - if ( !tuple->farray( prefix + "_" + *n + "MCMatchFracs", mc_match_fracs.begin(), mc_match_fracs.end(), - prefix + "_" + *n + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - if ( !tuple->farray( prefix + "_" + *n + "TOSMatchFracs", reco_match_fracs.begin(), reco_match_fracs.end(), - prefix + "_" + *n + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - if ( !tuple->farray( prefix + "_" + *n + "MCUnMatchFracs", mc_unmatch_fracs.begin(), mc_unmatch_fracs.end(), - prefix + "_" + *n + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - } - // TODO add a total nTOS branch? - } else { - warning() << "Arghhh! Particle = 0... Not doing anything" << endmsg; - } - - if ( msgLevel( MSG::DEBUG ) ) { debug() << "Done " << prefix << " " << m_level << endmsg; } - - return StatusCode::SUCCESS; -} - -bool MCTupleToolTOS::compileTriggerLineList( const std::vector& list ) { - - if ( msgLevel( MSG::DEBUG ) ) debug() << "compiling List " << endmsg; - - boost::regex hlt1( "Hlt1.*Decision" ); - boost::regex hlt2( "Hlt2.*Decision" ); - - for ( std::vector::const_iterator s = list.begin(); s != list.end(); ++s ) { - if ( boost::regex_match( *s, hlt1 ) ) { - m_hlt1.push_back( *s ); - } else if ( boost::regex_match( *s, hlt2 ) ) { - m_hlt2.push_back( *s ); - } else { - error() << "List member ``" << *s - << "'' does not match any known pattern. Have you forgotten the trailing 'Decision'? " << endmsg; - } - } - - if ( msgLevel( MSG::DEBUG ) ) { - debug() << " ==== HLT1 ==== " << endmsg; - for ( std::vector::const_iterator s = m_hlt1.begin(); s != m_hlt1.end(); ++s ) - debug() << " " << ( *s ); - debug() << endmsg; - debug() << " ==== HLT2 ==== " << endmsg; - for ( std::vector::const_iterator s = m_hlt2.begin(); s != m_hlt2.end(); ++s ) - debug() << " " << ( *s ); - debug() << endmsg; - debug() << " ==== Compiled list ====" << endmsg; - } - - return true; -} \ No newline at end of file diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOS.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOS.h deleted file mode 100644 index 56be678d..00000000 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOS.h +++ /dev/null @@ -1,75 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#ifndef MCTUPLETOOLTOS_H -#define MCTUPLETOOLTOS_H 1 - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Event/HltSelReports.h" -#include "Event/RecVertex.h" -#include "GaudiKernel/DataObjectHandle.h" -#include "Kernel/IMCParticleTupleTool.h" // Interface -#include "Kernel/Particle2MCLinker.h" - -/** @class MCTupleToolTOS MCTupleToolTOS.h - * - * Add "trigger-on-signal" decision flags to the tuple, as well as other related information on the trigger candidate - - * MCParticle matching - * - * Matching is done by extracting the LHCbIDs (hits) from the MCParticle and the trigger candidate, - * then comparing the two containers of hits. If there is greater than or equal to fraction of the - * MCParticle hits overlapping, then we declare that the trigger candidate was TOS with respect to that MCParticle. If - * at least one trigger candidate has triggered on the signal, then that line has triggered on the signal in the event. - * - * NOTE that currently all hits from each track in the trigger candidate are all aggregated into a single container. - * We then compare this container to the MCParticle's hits. For trigger candidates made up of e.g. 4 tracks, - * this method will say a trigger is TOS if only 3 of the 4 tracks are indeed from the signal. - * - * \todo TOS match on a track-by-track basis to fix this issue. - * - * See for further description of the algorithm and results on a simple - * test case. - * - * \sa MCDecayTreeTuple - * - * @author Ross Hunter - * @date 2020-03-03 - */ - -using IDvec = std::vector; -class MCTupleToolTOS : public TupleToolBase, virtual public IMCParticleTupleTool { -public: - /// Standard constructor - MCTupleToolTOS( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, Tuples::Tuple& ) override; - -private: - bool fetchLHCbIDsFromHOS( const LHCb::HltObjectSummary& hltObjectSummary, IDvec& bucket_of_ids ); - bool fetchLHCbIDsFromMCParticle( const LHCb::MCParticle* mcp, const LHCb::LinksByKey* mc2IdLink, - std::map& map_of_ids ); - std::map getCandidateLHCbMap( const LHCb::HltObjectSummary& topLevelSummary ); - bool compileTriggerLineList( const std::vector& ); - -private: - DataObjectReadHandle m_hltSelReportDh = {this, "HltSelReports", - LHCb::HltSelReportsLocation::Default}; - DataObjectReadHandle m_mc2IdLinkDh = {this, "MC2IDLink", - "Link/Pr/LHCbID"}; // FIXME is there a default? - - Gaudi::Property tos_threshold{this, "tos_threshold", {0.70}}; - Gaudi::Property max_candidates{this, "max_candidates", {20}}; - Gaudi::Property m_level{this, "Level", "Hlt1"}; - std::vector m_hlt1{std::vector( 0 )}; - std::vector m_hlt2{std::vector( 0 )}; - Gaudi::Property> m_triggerList{ - this, "TriggerList", std::vector( 0 )}; // property: list of triggers to specifically look at -}; -#endif // MCTUPLETOOLTOS_H diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp new file mode 100644 index 00000000..5d7b45b7 --- /dev/null +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp @@ -0,0 +1,142 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +// Include files +#include "boost/regex.hpp" +#include "gsl/gsl_sys.h" + +// local +#include "Event/MCParticle.h" +#include "GaudiAlg/Tuple.h" +#include "GaudiAlg/TupleObj.h" +#include "MCTupleToolTOSBase.h" + +using namespace LHCb; +//----------------------------------------------------------------------------- +// Implementation file for class : MCTupleToolTOSBase +// +// 2021-09-02 : Ross Hunter +//----------------------------------------------------------------------------- + +//============================================================================= +// Standard constructor, initializes variables +//============================================================================= +MCTupleToolTOSBase::MCTupleToolTOSBase( const std::string& type, const std::string& name, const IInterface* parent ) + : TupleToolBase( type, name, parent ) { + declareInterface( this ); +} + +//============================================================================= +// initialize +//============================================================================= +StatusCode MCTupleToolTOSBase::initialize() { + if ( !TupleToolBase::initialize() ) return StatusCode::FAILURE; + + if ( !m_triggerList.empty() ) compileTriggerLineList( m_triggerList ); + + return StatusCode::SUCCESS; +} + +void MCTupleToolTOSBase::fetchLHCbIDsFromMCParticle( const LHCb::MCParticle& mcp, const LHCb::LinksByKey* mc2IdLink, + std::map& map_of_ID_weights ) { + // Recursive function to iterate over each child of the MCParticle and collect the LHCbIDs in map + + // Add this track's LHCbIDs to the map + std::map this_track_map_of_ids{}; + mc2IdLink->applyToAllLinks( [&this_track_map_of_ids, &mcp]( unsigned int id, int mcPartKey, float weight ) { + if ( mcPartKey == mcp.key() ) { this_track_map_of_ids.insert( {LHCb::LHCbID( id ), weight} ); } + } ); + if ( this_track_map_of_ids.size() > 0 ) { map_of_ID_weights.merge( this_track_map_of_ids ); } + + // Now iterate through children and add their LHCbIDs to the map + // Use the MCParticle::endVertices method to get vertices on this track. Those that are are isDecay() are decay + // vertices + // TODO should we consider other types of vertex? I guess they are just radiating photons, material interactions etc. + const auto& endVertices = mcp.endVertices(); + for ( const auto& decayVertex : endVertices ) { + if ( decayVertex->isDecay() ) { + const auto& decayProducts = decayVertex->products(); + for ( const auto& childParticle : decayProducts ) { + fetchLHCbIDsFromMCParticle( *childParticle, mc2IdLink, map_of_ID_weights ); + } + } + } + + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "Collected " << map_of_ID_weights.size() << " IDs for MCParticle with ID " << mcp.particleID() << endmsg; + } +} + +bool MCTupleToolTOSBase::tos_match( const IDvec& candidate_IDs, const std::map& mcp_ID_map, + std::vector& mc_match_fracs, std::vector& reco_match_fracs, + std::vector& mc_unmatch_fracs ) { + + if ( ( mcp_ID_map.size() == 0 ) || ( candidate_IDs.size() == 0 ) ) { + return false; // Can't be TOS if either of these are the case + } + + float n_matching_IDs{0.f}; + for ( const auto& id : candidate_IDs ) { + const auto iter = mcp_ID_map.find( id ); + if ( iter != mcp_ID_map.end() ) { n_matching_IDs += iter->second; } + } + + float mc_match_frac{1.f}; + float reco_match_frac{1.f}; + float mc_unmatch_frac{0.f}; + + mc_match_frac = n_matching_IDs / mcp_ID_map.size(); + reco_match_frac = n_matching_IDs / candidate_IDs.size(); + mc_unmatch_frac = 1.f - mc_match_frac; + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "Fraction of MCP IDs that overlap with the candidate is " << std::to_string( mc_match_frac ) << endmsg; + debug() << "Fraction of IDs that overlap with the MCP is (TOS) " << std::to_string( reco_match_frac ) << endmsg; + } + if ( reco_match_frac > 1.f ) { + error() << "Found (n_matching_IDs / n_IDs in trigger candidate) = " << reco_match_frac << ". Shouldnt be possible." + << endmsg; + } + + mc_match_fracs.emplace_back( mc_match_frac ); + reco_match_fracs.emplace_back( reco_match_frac ); + mc_unmatch_fracs.emplace_back( mc_unmatch_frac ); + return ( reco_match_frac >= tos_threshold ); +} + +bool MCTupleToolTOSBase::compileTriggerLineList( const std::vector& line_names ) { + + if ( msgLevel( MSG::DEBUG ) ) debug() << "Compiling list of trigger lines" << endmsg; + + boost::regex hlt1( "Hlt1.*Decision" ); + boost::regex hlt2( "Hlt2.*Decision" ); + + for ( const auto& line_name : line_names ) { + if ( boost::regex_match( line_name, hlt1 ) ) { + m_hlt1_line_names.push_back( line_name ); + } else if ( boost::regex_match( line_name, hlt2 ) ) { + m_hlt2_line_names.push_back( line_name ); + } else { + error() << "List member ``" << line_name + << "'' does not match any known pattern. Have you forgotten the trailing 'Decision'? " << endmsg; + } + } + + if ( msgLevel( MSG::DEBUG ) ) { + debug() << " ==== HLT1 ==== " << endmsg; + for ( const auto& line_name : m_hlt1_line_names ) debug() << " " << line_name; + debug() << endmsg; + debug() << " ==== HLT2 ==== " << endmsg; + for ( const auto& line_name : m_hlt2_line_names ) debug() << " " << line_name; + debug() << endmsg; + debug() << " ==== Compiled list ====" << endmsg; + } + + return true; +} \ No newline at end of file diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h new file mode 100644 index 00000000..e827b475 --- /dev/null +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h @@ -0,0 +1,79 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +#ifndef MCTUPLETOOLTOSBASE_H +#define MCTUPLETOOLTOSBASE_H 1 + +#include "DecayTreeTupleBase/TupleToolBase.h" +#include "GaudiKernel/DataObjectHandle.h" +#include "Kernel/IMCParticleTupleTool.h" // Interface +#include "Kernel/Particle2MCLinker.h" + +/** @class MCTupleToolTOSBase MCTupleToolTOSBase.h + * + * Add "trigger-on-signal" decision flags to the tuple, as well as other related information on the trigger candidate - + * MCParticle matching + * + * For each event and for each trigger line, matching is done by extracting the LHCbIDs (hits) from the MCParticle + * and its children and placing them together into one container. The hits are similarly collected for the trigger + * candidate. The two containers of hits are then compared for overlap. If there is greater than or equal to + * fraction of the trigger candidate hits overlapping with the MCParticle, then we declare that the + * trigger candidate was TOS with respect to that MCParticle. For example if a hypothetical TwoTrackLine combines two + * tracks in a Bs -> JpsiPhi event, and the hits of this TwoTrackLine candidate match the combination of two muons from + * the Jpsi, then for this event Jpsi_TwoTrackLineTOS = 1. + * + * Extraction of LHCbIDs from the trigger candidate differs in implementation for HLT1 and HLT2, hence there are two + * inheriting classes: MCTupleToolTOSHLT1 and MCTupleToolTOSHLT2. The former (latter) gets LHCbIDs from the SelReports + * (persisted candidates). These differing data dependencies require a different derived class. + * + * NOTE that currently all hits from each track in the trigger candidate are all aggregated into a single container. + * We then compare this container to the MCParticle's hits. For trigger candidates made up of e.g. 4 tracks, + * this method will say a trigger is TOS if only 3 of the 4 tracks are indeed from the signal. This issue is described + * in the vCHEP paper linked below. + * + * \todo TOS match on a track-by-track basis to fix this issue. + * + * See https://doi.org/10.1051/epjconf/202125104024 for further description of the algorithm and results on a simple + * test case. + * + * \sa MCDecayTreeTuple, MCTupleToolTOSHLT1, MCTupleToolTOSHLT2 + * + * @author Ross Hunter + * @date 2021-09-02 + */ + +using IDvec = std::vector; +class MCTupleToolTOSBase : public TupleToolBase, virtual public IMCParticleTupleTool { +public: + /// Standard constructor + MCTupleToolTOSBase( const std::string& type, const std::string& name, const IInterface* parent ); + StatusCode initialize() override; + virtual StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, + Tuples::Tuple& ) override = 0; + +protected: + void fetchLHCbIDsFromMCParticle( const LHCb::MCParticle& mcp, const LHCb::LinksByKey* mc2IdLink, + std::map& map_of_ids ); + bool tos_match( const IDvec& candidate_IDs, const std::map& mcp_ID_map, + std::vector& mc_match_fracs, std::vector& reco_match_fracs, + std::vector& mc_unmatch_fracs ); + bool compileTriggerLineList( const std::vector& ); + +protected: + DataObjectReadHandle m_mc2IdLinkDh = {this, "MC2IDLink", + "Link/Pr/LHCbID"}; // FIXME is there a default? + Gaudi::Property tos_threshold{this, "tos_threshold", {0.70}}; + Gaudi::Property max_candidates{this, "max_candidates", {20}}; + std::vector m_hlt1_line_names{std::vector( 0 )}; + std::vector m_hlt2_line_names{std::vector( 0 )}; + Gaudi::Property> m_triggerList{ + this, "TriggerList", std::vector( 0 )}; // property: list of triggers to specifically look at +}; +#endif // MCTUPLETOOLTOSBASE_H diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp new file mode 100644 index 00000000..849fdd97 --- /dev/null +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp @@ -0,0 +1,167 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +// Include files +#include "boost/regex.hpp" +#include "gsl/gsl_sys.h" + +// local +#include "Event/MCParticle.h" +#include "GaudiAlg/Tuple.h" +#include "GaudiAlg/TupleObj.h" +#include "MCTupleToolTOSHLT1.h" + +using namespace LHCb; +//----------------------------------------------------------------------------- +// Implementation file for class : MCTupleToolTOSHLT1 +// +// 2021-09-02 : Ross Hunter +//----------------------------------------------------------------------------- + +// Declaration of the Tool Factory +DECLARE_COMPONENT( MCTupleToolTOSHLT1 ) + +//============================================================================= +// Standard constructor, initializes variables +//============================================================================= +MCTupleToolTOSHLT1::MCTupleToolTOSHLT1( const std::string& type, const std::string& name, const IInterface* parent ) + : MCTupleToolTOSBase( type, name, parent ) { + declareInterface( this ); +} + +std::map MCTupleToolTOSHLT1::getCandidateLHCbMap( const LHCb::HltObjectSummary& topLevelSummary ) { + + std::map idsByTriggerCandidateMap{}; + + if ( topLevelSummary.summarizedObjectCLID() == 1 ) { + // A selection summary, made up of tracks and vertices + const SmartRefVector& sub = topLevelSummary.substructure(); + + int iCand = 0; + for ( const auto& subsummary : sub ) { + IDvec thisCandIDVec{}; + if ( !fetchLHCbIDsFromHOS( subsummary, thisCandIDVec ) ) { + error() << "Failed to fetch LHCbIDs from subsummary with CLID " << subsummary->summarizedObjectCLID() << endmsg; + } + auto result = idsByTriggerCandidateMap.insert( std::pair( thisCandIDVec, iCand ) ); + if ( !result.second ) { warning() << "Insertion failed. Is this candidate is already there?" << endmsg; } + iCand++; + } + } else { + error() << "Not a selection summary. Dont know what to do with this object with summarizedObjectCLID " + << topLevelSummary.summarizedObjectCLID() << endmsg; + } + return idsByTriggerCandidateMap; +} + +bool MCTupleToolTOSHLT1::fetchLHCbIDsFromHOS( const SmartRef& hltObjectSummary, + IDvec& bucket_of_ids ) { + // Recursive function to iterate over each track of the trigger candidate and collect the LHCbIDs in bucket_of_ids + + const auto& sub = hltObjectSummary->substructure(); + + if ( hltObjectSummary->summarizedObjectCLID() == 10030 ) { + // Vertex-like summary -> should be made of tracks and further vertices -> pass on the substructure... + bool isEmptySummary = true; + for ( const auto& subsummary : sub ) { + if ( !fetchLHCbIDsFromHOS( subsummary, bucket_of_ids ) ) { + error() << "Failed to fetch LHCbIDs from subsummary with CLID " << subsummary->summarizedObjectCLID() << endmsg; + return false; + } + isEmptySummary = false; + } + if ( isEmptySummary ) { return false; } + } else if ( hltObjectSummary->summarizedObjectCLID() == 10010 ) { + // Track-like -> add to the bucket. + bucket_of_ids.insert( bucket_of_ids.end(), hltObjectSummary->lhcbIDs().begin(), hltObjectSummary->lhcbIDs().end() ); + + // NOTE it seems that the lhcbIDs() and lhcbIDsFlattened() method do the same thing, or the case where they differ + // is unknown to me so we'll put this to catch when this case arises: + assert( hltObjectSummary->lhcbIDs() == hltObjectSummary->lhcbIDsFlattened() ); + } else { + warning() << "Dont know how to handle object with summarizedObjectCLID " << hltObjectSummary->summarizedObjectCLID() + << endmsg; + return false; + } + return true; +} + +//============================================================================= +// Fill +//============================================================================= +StatusCode MCTupleToolTOSHLT1::fill( const LHCb::MCParticle*, const LHCb::MCParticle* mcp, const std::string& head, + Tuples::Tuple& tuple ) { + const std::string prefix = fullName( head ); + + // TODO need to figure out why it looks like this is all getting called twice. + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "Filling HLT1 TOS branches for mcp with ID " << mcp->particleID() << endmsg; + } + + if ( mcp == nullptr ) { + warning() << "Particle is NULL. Exiting." << endmsg; + return StatusCode::FAILURE; + } + + // Get the LHCbIDs from the MCParticle + LHCb::LinksByKey* mcp_id_link = m_mc2IdLinkDh.get(); + + // TODO is weight always =1? If so a simpler vector will suffice. + std::map mcp_ID_map{}; + fetchLHCbIDsFromMCParticle( *mcp, mcp_id_link, mcp_ID_map ); + + LHCb::HltSelReports* selReports = m_hltSelReportDh.get(); + + for ( const auto& decision_name : m_hlt1_line_names ) { + // individual Hlt trigger lines + bool tos_on_this_line{false}; + std::vector mc_match_fracs( max_candidates ), reco_match_fracs( max_candidates ), + mc_unmatch_fracs( max_candidates ); + + for ( LHCb::HltSelReports::Container::const_iterator it = selReports->begin(); it != selReports->end(); ++it ) { + if ( it->first == decision_name ) { + + const LHCb::HltObjectSummary hltObjectSummary = it->second; + auto idsByCandidateMap = getCandidateLHCbMap( hltObjectSummary ); + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "Found " << idsByCandidateMap.size() << " candidates that the trigger built for " << decision_name + << endmsg; + } + + for ( auto const& [trig_cand_IDs, i] : idsByCandidateMap ) { + tos_on_this_line |= + tos_match( trig_cand_IDs, mcp_ID_map, mc_match_fracs, reco_match_fracs, mc_unmatch_fracs ); + } + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "For trigger with name = " << decision_name << ", TOS decision = " << tos_on_this_line + << " on MCParticle with ID " << mcp->particleID() << endmsg; + } + } // If SelRep corresponds to trigger line + } // Loop over SelReports + if ( !tuple->column( prefix + "_" + decision_name + "TOS", tos_on_this_line ) ) { return StatusCode::FAILURE; } + if ( !tuple->farray( prefix + "_" + decision_name + "MCMatchFracs", mc_match_fracs.begin(), mc_match_fracs.end(), + prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { + return StatusCode::FAILURE; + } + if ( !tuple->farray( prefix + "_" + decision_name + "TOSMatchFracs", reco_match_fracs.begin(), + reco_match_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { + return StatusCode::FAILURE; + } + if ( !tuple->farray( prefix + "_" + decision_name + "MCUnMatchFracs", mc_unmatch_fracs.begin(), + mc_unmatch_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { + return StatusCode::FAILURE; + } + } // Loop over trigger lines + // TODO add a total nTOS branch? + + if ( msgLevel( MSG::DEBUG ) ) { debug() << "Filled branches for " << prefix << " Hlt1" << endmsg; } + + return StatusCode::SUCCESS; +} \ No newline at end of file diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h new file mode 100644 index 00000000..8437ae8e --- /dev/null +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h @@ -0,0 +1,31 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +#ifndef MCTUPLETOOLTOSHLT1_H +#define MCTUPLETOOLTOSHLT1_H 1 + +#include "Event/HltSelReports.h" +#include "MCTupleToolTOSBase.h" + +class MCTupleToolTOSHLT1 : public MCTupleToolTOSBase { +public: + /// Standard constructor + MCTupleToolTOSHLT1( const std::string& type, const std::string& name, const IInterface* parent ); + StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, Tuples::Tuple& ) override; + +private: + bool fetchLHCbIDsFromHOS( const SmartRef& hltObjectSummary, IDvec& bucket_of_ids ); + std::map getCandidateLHCbMap( const LHCb::HltObjectSummary& topLevelSummary ); + +private: + DataObjectReadHandle m_hltSelReportDh = {this, "HltSelReports", + LHCb::HltSelReportsLocation::Default}; +}; +#endif // MCTUPLETOOLTOSHLT1_H diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp new file mode 100644 index 00000000..f1831338 --- /dev/null +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp @@ -0,0 +1,188 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +// Include files +#include "boost/algorithm/string/replace.hpp" +#include "boost/regex.hpp" +#include "gsl/gsl_sys.h" + +// local +#include "Event/MCParticle.h" +#include "GaudiAlg/Tuple.h" +#include "GaudiAlg/TupleObj.h" +#include "MCTupleToolTOSHLT2.h" + +using namespace LHCb; +//----------------------------------------------------------------------------- +// Implementation file for class : MCTupleToolTOSHLT2 +// +// 2021-09-02 : Ross Hunter +//----------------------------------------------------------------------------- + +// Declaration of the Tool Factory +DECLARE_COMPONENT( MCTupleToolTOSHLT2 ) + +//============================================================================= +// Standard constructor, initializes variables +//============================================================================= +MCTupleToolTOSHLT2::MCTupleToolTOSHLT2( const std::string& type, const std::string& name, const IInterface* parent ) + : MCTupleToolTOSBase( type, name, parent ) { + declareInterface( this ); +} + +//============================================================================= +// initialize +//============================================================================= +StatusCode MCTupleToolTOSHLT2::initialize() { + if ( !MCTupleToolTOSBase::initialize() ) return StatusCode::FAILURE; + + for ( auto const& location : m_candidateList ) { + std::cout << "Adding input TES location " << location << std::endl; + m_candidateHandles.push_back( std::make_unique>( location, this ) ); + bool declared = false; + for ( auto const& line : m_triggerList ) { + std::string line_without_decision = line; + boost::replace_all( line_without_decision, "Decision", "" ); + if ( location.find( line_without_decision ) != std::string::npos ) { + declareProperty( line_without_decision + "_Candidates", *( m_candidateHandles.back() ) ); + declared = true; + } + } + if ( !declared ) { + error() << "Passed trigger candidates at " << location + << " which dont match to any of the lines in m_triggerList." << endmsg; + return StatusCode::FAILURE; + } + } + + return StatusCode::SUCCESS; +} + +void MCTupleToolTOSHLT2::fetchLHCbIDsFromRecoParticle( const LHCb::Particle& part, IDvec& bucket_of_ids ) { + // Recursive function to extract all the LHCbIDs from a persisted trigger candidate + + if ( part.isBasicParticle() ) { + // We can just get the protoparticle and its IDs + bucket_of_ids.insert( bucket_of_ids.end(), part.proto()->track()->lhcbIDs().begin(), + part.proto()->track()->lhcbIDs().end() ); + } else { + const auto& children = part.daughters(); + for ( const auto& child : children ) { fetchLHCbIDsFromRecoParticle( *child, bucket_of_ids ); } + } +} + +//============================================================================= +// Fill +//============================================================================= +StatusCode MCTupleToolTOSHLT2::fill( const LHCb::MCParticle*, const LHCb::MCParticle* mcp, const std::string& head, + Tuples::Tuple& tuple ) { + const std::string prefix = fullName( head ); + + // TODO need to figure out why it looks like this is all getting called twice. + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "Filling HLT2 TOS branches for mcp with ID " << mcp->particleID() << endmsg; + } + + if ( mcp == nullptr ) { + warning() << "Particle is NULL. Exiting." << endmsg; + return StatusCode::FAILURE; + } + + // Get the LHCbIDs from the MCParticle + LHCb::LinksByKey* mcp_id_link = m_mc2IdLinkDh.get(); + + // TODO is weight always =1? If so a simpler vector will suffice. + std::map mcp_ID_map{}; + fetchLHCbIDsFromMCParticle( *mcp, mcp_id_link, mcp_ID_map ); + + for ( const auto& decision_name : m_hlt2_line_names ) { + // individual Hlt trigger lines + bool tos_on_this_line{false}; + std::vector mc_match_fracs( max_candidates ), reco_match_fracs( max_candidates ), + mc_unmatch_fracs( max_candidates ); + + // Check first if there was a positive trigger decision, then can proceed to TOS matching on the candidate if so + // Have to check this as candidates are saved to TES whether decision is positive or not + bool trigger_decision = false; + const LHCb::HltDecReports* decReports = m_hlt2DecReportDh.get(); + for ( LHCb::HltDecReports::Container::const_iterator it = decReports->begin(); it != decReports->end(); ++it ) { + if ( ( it->first == decision_name ) ) { + trigger_decision = (bool)it->second.decision(); + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "Found decReport for " << decision_name << ". Decision = " << it->second.decision(); + debug() << ( trigger_decision ? "Proceeding to " : "Will not attempt to " ) + << "TOS match the trigger candidate to the truth candidate." << endmsg; + } + } + } + + if ( trigger_decision ) { + std::string line_name = decision_name; + boost::replace_first( line_name, "Decision", "" ); + + for ( auto& candHandle : m_candidateHandles ) { + if ( !candHandle->isValid() ) continue; + + if ( candHandle->objKey().find( line_name ) != std::string::npos ) { + LHCb::Particles* candidates = candHandle->get(); + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "There are " << candidates->size() << " candidates in " << candHandle->objKey() << " for " + << decision_name << endmsg; + } + + std::map idsByCandidateMap{}; + int iCand = 0; + for ( const auto& cand : *candidates ) { + IDvec id_vec{}; // Upgrade to IDsByTrack after !807 + fetchLHCbIDsFromRecoParticle( *cand, id_vec ); + if ( !idsByCandidateMap.insert( std::pair( id_vec, iCand ) ).second ) { + warning() << "Insertion failed. Seems this set of LHCbIDs is already there." << endmsg; + } + iCand++; + } + + for ( auto const& [trig_cand_IDs, i] : idsByCandidateMap ) { + tos_on_this_line |= + tos_match( trig_cand_IDs, mcp_ID_map, mc_match_fracs, reco_match_fracs, mc_unmatch_fracs ); + } + } // if candidates this line match the trigger line + } // loop over candidates from all lines + } else { + // Trigger decision is negative + tos_on_this_line = false; + mc_match_fracs.emplace_back( 0.f ); + reco_match_fracs.emplace_back( 0.f ); + mc_unmatch_fracs.emplace_back( 1.f ); + } + + if ( msgLevel( MSG::DEBUG ) ) { + debug() << "For trigger with name = " << decision_name << ", TOS decision = " << tos_on_this_line + << " on MCParticle with ID " << mcp->particleID() << endmsg; + } + if ( !tuple->column( prefix + "_" + decision_name + "TOS", tos_on_this_line ) ) { return StatusCode::FAILURE; } + if ( !tuple->farray( prefix + "_" + decision_name + "MCMatchFracs", mc_match_fracs.begin(), mc_match_fracs.end(), + prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { + return StatusCode::FAILURE; + } + if ( !tuple->farray( prefix + "_" + decision_name + "TOSMatchFracs", reco_match_fracs.begin(), + reco_match_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { + return StatusCode::FAILURE; + } + if ( !tuple->farray( prefix + "_" + decision_name + "MCUnMatchFracs", mc_unmatch_fracs.begin(), + mc_unmatch_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { + return StatusCode::FAILURE; + } + } // Loop over trigger lines + // TODO add a total nTOS branch? + + if ( msgLevel( MSG::DEBUG ) ) { debug() << "Filled branches for " << prefix << " Hlt2" << endmsg; } + + return StatusCode::SUCCESS; +} \ No newline at end of file diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h new file mode 100644 index 00000000..8c161560 --- /dev/null +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h @@ -0,0 +1,33 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2018 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. * +\*****************************************************************************/ +#ifndef MCTUPLETOOLTOSHLT2_H +#define MCTUPLETOOLTOSHLT2_H 1 + +#include "Event/HltDecReports.h" +#include "MCTupleToolTOSBase.h" + +class MCTupleToolTOSHLT2 : public MCTupleToolTOSBase { +public: + /// Standard constructor + MCTupleToolTOSHLT2( const std::string& type, const std::string& name, const IInterface* parent ); + StatusCode initialize() override; + StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, Tuples::Tuple& ) override; + +private: + void fetchLHCbIDsFromRecoParticle( const LHCb::Particle& part, IDvec& bucket_of_ids ); + +private: + std::vector>> m_candidateHandles; + Gaudi::Property> m_candidateList{this, "CandidateLocations", {}, ""}; + DataObjectReadHandle m_hlt2DecReportDh = {this, "Hlt2DecReports", + LHCb::HltDecReportsLocation::Hlt2Default}; +}; +#endif // MCTUPLETOOLTOSHLT2_H -- GitLab From b67f544e91adb81b5946c56b3c0fd604e8bbd88e Mon Sep 17 00:00:00 2001 From: Ross John Hunter Date: Mon, 27 Sep 2021 10:23:13 +0200 Subject: [PATCH 52/82] TOS match on track-by-track basis in MCTupleToolTOS --- .../src/MCTupleToolTOSBase.cpp | 57 +++++++++---------- .../DecayTreeTupleMC/src/MCTupleToolTOSBase.h | 36 +++++------- .../src/MCTupleToolTOSHLT1.cpp | 39 ++++--------- .../DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h | 4 +- .../src/MCTupleToolTOSHLT2.cpp | 41 ++++--------- .../DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h | 2 +- 6 files changed, 67 insertions(+), 112 deletions(-) diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp index 5d7b45b7..792a02a9 100644 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.cpp @@ -45,7 +45,7 @@ StatusCode MCTupleToolTOSBase::initialize() { } void MCTupleToolTOSBase::fetchLHCbIDsFromMCParticle( const LHCb::MCParticle& mcp, const LHCb::LinksByKey* mc2IdLink, - std::map& map_of_ID_weights ) { + WeightedIDsByMCPTrack& weighted_ids_by_mcp_track ) { // Recursive function to iterate over each child of the MCParticle and collect the LHCbIDs in map // Add this track's LHCbIDs to the map @@ -53,7 +53,7 @@ void MCTupleToolTOSBase::fetchLHCbIDsFromMCParticle( const LHCb::MCParticle& mcp mc2IdLink->applyToAllLinks( [&this_track_map_of_ids, &mcp]( unsigned int id, int mcPartKey, float weight ) { if ( mcPartKey == mcp.key() ) { this_track_map_of_ids.insert( {LHCb::LHCbID( id ), weight} ); } } ); - if ( this_track_map_of_ids.size() > 0 ) { map_of_ID_weights.merge( this_track_map_of_ids ); } + if ( this_track_map_of_ids.size() > 0 ) { weighted_ids_by_mcp_track.emplace_back( this_track_map_of_ids ); } // Now iterate through children and add their LHCbIDs to the map // Use the MCParticle::endVertices method to get vertices on this track. Those that are are isDecay() are decay @@ -64,50 +64,45 @@ void MCTupleToolTOSBase::fetchLHCbIDsFromMCParticle( const LHCb::MCParticle& mcp if ( decayVertex->isDecay() ) { const auto& decayProducts = decayVertex->products(); for ( const auto& childParticle : decayProducts ) { - fetchLHCbIDsFromMCParticle( *childParticle, mc2IdLink, map_of_ID_weights ); + fetchLHCbIDsFromMCParticle( *childParticle, mc2IdLink, weighted_ids_by_mcp_track ); } } } if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Collected " << map_of_ID_weights.size() << " IDs for MCParticle with ID " << mcp.particleID() << endmsg; + debug() << "Collected " << weighted_ids_by_mcp_track.size() << " IDs for MCParticle with ID " << mcp.particleID() + << endmsg; } } -bool MCTupleToolTOSBase::tos_match( const IDvec& candidate_IDs, const std::map& mcp_ID_map, - std::vector& mc_match_fracs, std::vector& reco_match_fracs, - std::vector& mc_unmatch_fracs ) { +bool MCTupleToolTOSBase::tos_match( const IDsByTrack& ids_by_candidate_track, + const WeightedIDsByMCPTrack& weighted_ids_by_mcp_track ) { - if ( ( mcp_ID_map.size() == 0 ) || ( candidate_IDs.size() == 0 ) ) { + if ( ( weighted_ids_by_mcp_track.size() == 0 ) || ( ids_by_candidate_track.size() == 0 ) ) { return false; // Can't be TOS if either of these are the case } - float n_matching_IDs{0.f}; - for ( const auto& id : candidate_IDs ) { - const auto iter = mcp_ID_map.find( id ); - if ( iter != mcp_ID_map.end() ) { n_matching_IDs += iter->second; } - } - - float mc_match_frac{1.f}; - float reco_match_frac{1.f}; - float mc_unmatch_frac{0.f}; + auto reco_track_matches_to_mcp = [& m_tos_threshold = m_tos_threshold, + &weighted_ids_by_mcp_track]( const IDvec& reco_track_IDs ) { + if ( reco_track_IDs.size() == 0 ) { return false; } + for ( const auto& mcp_track_IDs : weighted_ids_by_mcp_track ) { + float n_matching_IDs{0.f}; + for ( const auto& id : reco_track_IDs ) { + const auto iter = mcp_track_IDs.find( id ); + if ( iter != mcp_track_IDs.end() ) { n_matching_IDs += iter->second; } + } + float reco_match_frac = n_matching_IDs / reco_track_IDs.size(); + if ( reco_match_frac >= m_tos_threshold ) { return true; } + } + return false; + }; - mc_match_frac = n_matching_IDs / mcp_ID_map.size(); - reco_match_frac = n_matching_IDs / candidate_IDs.size(); - mc_unmatch_frac = 1.f - mc_match_frac; - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "Fraction of MCP IDs that overlap with the candidate is " << std::to_string( mc_match_frac ) << endmsg; - debug() << "Fraction of IDs that overlap with the MCP is (TOS) " << std::to_string( reco_match_frac ) << endmsg; - } - if ( reco_match_frac > 1.f ) { - error() << "Found (n_matching_IDs / n_IDs in trigger candidate) = " << reco_match_frac << ". Shouldnt be possible." - << endmsg; + bool all_tracks_match_to_mcp = true; + for ( const auto& ids_this_track : ids_by_candidate_track ) { + all_tracks_match_to_mcp &= reco_track_matches_to_mcp( ids_this_track ); } - mc_match_fracs.emplace_back( mc_match_frac ); - reco_match_fracs.emplace_back( reco_match_frac ); - mc_unmatch_fracs.emplace_back( mc_unmatch_frac ); - return ( reco_match_frac >= tos_threshold ); + return all_tracks_match_to_mcp; } bool MCTupleToolTOSBase::compileTriggerLineList( const std::vector& line_names ) { diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h index e827b475..3f47cc0a 100644 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSBase.h @@ -21,27 +21,22 @@ * Add "trigger-on-signal" decision flags to the tuple, as well as other related information on the trigger candidate - * MCParticle matching * - * For each event and for each trigger line, matching is done by extracting the LHCbIDs (hits) from the MCParticle - * and its children and placing them together into one container. The hits are similarly collected for the trigger - * candidate. The two containers of hits are then compared for overlap. If there is greater than or equal to - * fraction of the trigger candidate hits overlapping with the MCParticle, then we declare that the - * trigger candidate was TOS with respect to that MCParticle. For example if a hypothetical TwoTrackLine combines two - * tracks in a Bs -> JpsiPhi event, and the hits of this TwoTrackLine candidate match the combination of two muons from + * For each event and for each trigger line, matching is done by extracting the LHCbIDs (hits) from each track + * of the composite signal MCParticle and each track in the trigger candidate. The hits of each trigger candidate track + * are then compared against all the tracks in the MCParticle for overlapping hits. If there is greater than or equal to + * fraction of the trigger candidate hits overlapping with the MCParticle in that track, that track + * is declared to be matched. For the trigger candidate to be TOS with respect to the MCParticle, we require that every + * track sufficiently matches to a track in the MCParticle. For example: if a hypothetical TwoTrackLine combines two + * tracks in a Bs -> JpsiPhi event, and the two tracks of this TwoTrackLine candidate match the two true muons from * the Jpsi, then for this event Jpsi_TwoTrackLineTOS = 1. * * Extraction of LHCbIDs from the trigger candidate differs in implementation for HLT1 and HLT2, hence there are two * inheriting classes: MCTupleToolTOSHLT1 and MCTupleToolTOSHLT2. The former (latter) gets LHCbIDs from the SelReports * (persisted candidates). These differing data dependencies require a different derived class. * - * NOTE that currently all hits from each track in the trigger candidate are all aggregated into a single container. - * We then compare this container to the MCParticle's hits. For trigger candidates made up of e.g. 4 tracks, - * this method will say a trigger is TOS if only 3 of the 4 tracks are indeed from the signal. This issue is described - * in the vCHEP paper linked below. - * - * \todo TOS match on a track-by-track basis to fix this issue. - * * See https://doi.org/10.1051/epjconf/202125104024 for further description of the algorithm and results on a simple - * test case. + * test case. An older version of the algorithm is described there, with the current algorithm proposed as an + * improvement in the "Limitations" section. * * \sa MCDecayTreeTuple, MCTupleToolTOSHLT1, MCTupleToolTOSHLT2 * @@ -49,7 +44,9 @@ * @date 2021-09-02 */ -using IDvec = std::vector; +using IDvec = std::vector; +using IDsByTrack = std::vector; +using WeightedIDsByMCPTrack = std::vector>; class MCTupleToolTOSBase : public TupleToolBase, virtual public IMCParticleTupleTool { public: /// Standard constructor @@ -60,17 +57,14 @@ public: protected: void fetchLHCbIDsFromMCParticle( const LHCb::MCParticle& mcp, const LHCb::LinksByKey* mc2IdLink, - std::map& map_of_ids ); - bool tos_match( const IDvec& candidate_IDs, const std::map& mcp_ID_map, - std::vector& mc_match_fracs, std::vector& reco_match_fracs, - std::vector& mc_unmatch_fracs ); + WeightedIDsByMCPTrack& weighted_ids_by_mcp_track ); + bool tos_match( const IDsByTrack& candidate_IDs, const WeightedIDsByMCPTrack& mcp_ID_map ); bool compileTriggerLineList( const std::vector& ); protected: DataObjectReadHandle m_mc2IdLinkDh = {this, "MC2IDLink", "Link/Pr/LHCbID"}; // FIXME is there a default? - Gaudi::Property tos_threshold{this, "tos_threshold", {0.70}}; - Gaudi::Property max_candidates{this, "max_candidates", {20}}; + Gaudi::Property m_tos_threshold{this, "tos_threshold", {0.70}}; std::vector m_hlt1_line_names{std::vector( 0 )}; std::vector m_hlt2_line_names{std::vector( 0 )}; Gaudi::Property> m_triggerList{ diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp index 849fdd97..2eeb9376 100644 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.cpp @@ -36,9 +36,9 @@ MCTupleToolTOSHLT1::MCTupleToolTOSHLT1( const std::string& type, const std::stri declareInterface( this ); } -std::map MCTupleToolTOSHLT1::getCandidateLHCbMap( const LHCb::HltObjectSummary& topLevelSummary ) { +std::map MCTupleToolTOSHLT1::getLHCbIDsByTrigCand( const LHCb::HltObjectSummary& topLevelSummary ) { - std::map idsByTriggerCandidateMap{}; + std::map idsByTriggerCandidateMap{}; if ( topLevelSummary.summarizedObjectCLID() == 1 ) { // A selection summary, made up of tracks and vertices @@ -46,11 +46,11 @@ std::map MCTupleToolTOSHLT1::getCandidateLHCbMap( const LHCb::HltObj int iCand = 0; for ( const auto& subsummary : sub ) { - IDvec thisCandIDVec{}; - if ( !fetchLHCbIDsFromHOS( subsummary, thisCandIDVec ) ) { + IDsByTrack thisCandIDs{}; + if ( !fetchLHCbIDsFromHOS( subsummary, thisCandIDs ) ) { error() << "Failed to fetch LHCbIDs from subsummary with CLID " << subsummary->summarizedObjectCLID() << endmsg; } - auto result = idsByTriggerCandidateMap.insert( std::pair( thisCandIDVec, iCand ) ); + auto result = idsByTriggerCandidateMap.insert( std::pair( thisCandIDs, iCand ) ); if ( !result.second ) { warning() << "Insertion failed. Is this candidate is already there?" << endmsg; } iCand++; } @@ -62,7 +62,7 @@ std::map MCTupleToolTOSHLT1::getCandidateLHCbMap( const LHCb::HltObj } bool MCTupleToolTOSHLT1::fetchLHCbIDsFromHOS( const SmartRef& hltObjectSummary, - IDvec& bucket_of_ids ) { + IDsByTrack& bucket_of_ids ) { // Recursive function to iterate over each track of the trigger candidate and collect the LHCbIDs in bucket_of_ids const auto& sub = hltObjectSummary->substructure(); @@ -80,7 +80,7 @@ bool MCTupleToolTOSHLT1::fetchLHCbIDsFromHOS( const SmartRefsummarizedObjectCLID() == 10010 ) { // Track-like -> add to the bucket. - bucket_of_ids.insert( bucket_of_ids.end(), hltObjectSummary->lhcbIDs().begin(), hltObjectSummary->lhcbIDs().end() ); + bucket_of_ids.emplace_back( hltObjectSummary->lhcbIDs() ); // NOTE it seems that the lhcbIDs() and lhcbIDsFlattened() method do the same thing, or the case where they differ // is unknown to me so we'll put this to catch when this case arises: @@ -114,30 +114,27 @@ StatusCode MCTupleToolTOSHLT1::fill( const LHCb::MCParticle*, const LHCb::MCPart LHCb::LinksByKey* mcp_id_link = m_mc2IdLinkDh.get(); // TODO is weight always =1? If so a simpler vector will suffice. - std::map mcp_ID_map{}; - fetchLHCbIDsFromMCParticle( *mcp, mcp_id_link, mcp_ID_map ); + WeightedIDsByMCPTrack weighted_mcp_IDs{}; + fetchLHCbIDsFromMCParticle( *mcp, mcp_id_link, weighted_mcp_IDs ); LHCb::HltSelReports* selReports = m_hltSelReportDh.get(); for ( const auto& decision_name : m_hlt1_line_names ) { // individual Hlt trigger lines - bool tos_on_this_line{false}; - std::vector mc_match_fracs( max_candidates ), reco_match_fracs( max_candidates ), - mc_unmatch_fracs( max_candidates ); + bool tos_on_this_line{false}; for ( LHCb::HltSelReports::Container::const_iterator it = selReports->begin(); it != selReports->end(); ++it ) { if ( it->first == decision_name ) { const LHCb::HltObjectSummary hltObjectSummary = it->second; - auto idsByCandidateMap = getCandidateLHCbMap( hltObjectSummary ); + auto idsByCandidateMap = getLHCbIDsByTrigCand( hltObjectSummary ); if ( msgLevel( MSG::DEBUG ) ) { debug() << "Found " << idsByCandidateMap.size() << " candidates that the trigger built for " << decision_name << endmsg; } for ( auto const& [trig_cand_IDs, i] : idsByCandidateMap ) { - tos_on_this_line |= - tos_match( trig_cand_IDs, mcp_ID_map, mc_match_fracs, reco_match_fracs, mc_unmatch_fracs ); + tos_on_this_line |= tos_match( trig_cand_IDs, weighted_mcp_IDs ); } if ( msgLevel( MSG::DEBUG ) ) { debug() << "For trigger with name = " << decision_name << ", TOS decision = " << tos_on_this_line @@ -146,18 +143,6 @@ StatusCode MCTupleToolTOSHLT1::fill( const LHCb::MCParticle*, const LHCb::MCPart } // If SelRep corresponds to trigger line } // Loop over SelReports if ( !tuple->column( prefix + "_" + decision_name + "TOS", tos_on_this_line ) ) { return StatusCode::FAILURE; } - if ( !tuple->farray( prefix + "_" + decision_name + "MCMatchFracs", mc_match_fracs.begin(), mc_match_fracs.end(), - prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - if ( !tuple->farray( prefix + "_" + decision_name + "TOSMatchFracs", reco_match_fracs.begin(), - reco_match_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - if ( !tuple->farray( prefix + "_" + decision_name + "MCUnMatchFracs", mc_unmatch_fracs.begin(), - mc_unmatch_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } } // Loop over trigger lines // TODO add a total nTOS branch? diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h index 8437ae8e..b80acd68 100644 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT1.h @@ -21,8 +21,8 @@ public: StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, Tuples::Tuple& ) override; private: - bool fetchLHCbIDsFromHOS( const SmartRef& hltObjectSummary, IDvec& bucket_of_ids ); - std::map getCandidateLHCbMap( const LHCb::HltObjectSummary& topLevelSummary ); + bool fetchLHCbIDsFromHOS( const SmartRef& hltObjectSummary, IDsByTrack& bucket_of_ids ); + std::map getLHCbIDsByTrigCand( const LHCb::HltObjectSummary& topLevelSummary ); private: DataObjectReadHandle m_hltSelReportDh = {this, "HltSelReports", diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp index f1831338..4613bcc3 100644 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.cpp @@ -65,13 +65,12 @@ StatusCode MCTupleToolTOSHLT2::initialize() { return StatusCode::SUCCESS; } -void MCTupleToolTOSHLT2::fetchLHCbIDsFromRecoParticle( const LHCb::Particle& part, IDvec& bucket_of_ids ) { +void MCTupleToolTOSHLT2::fetchLHCbIDsFromRecoParticle( const LHCb::Particle& part, IDsByTrack& bucket_of_ids ) { // Recursive function to extract all the LHCbIDs from a persisted trigger candidate if ( part.isBasicParticle() ) { // We can just get the protoparticle and its IDs - bucket_of_ids.insert( bucket_of_ids.end(), part.proto()->track()->lhcbIDs().begin(), - part.proto()->track()->lhcbIDs().end() ); + bucket_of_ids.emplace_back( part.proto()->track()->lhcbIDs() ); } else { const auto& children = part.daughters(); for ( const auto& child : children ) { fetchLHCbIDsFromRecoParticle( *child, bucket_of_ids ); } @@ -99,14 +98,12 @@ StatusCode MCTupleToolTOSHLT2::fill( const LHCb::MCParticle*, const LHCb::MCPart LHCb::LinksByKey* mcp_id_link = m_mc2IdLinkDh.get(); // TODO is weight always =1? If so a simpler vector will suffice. - std::map mcp_ID_map{}; - fetchLHCbIDsFromMCParticle( *mcp, mcp_id_link, mcp_ID_map ); + WeightedIDsByMCPTrack weighted_mcp_IDs{}; + fetchLHCbIDsFromMCParticle( *mcp, mcp_id_link, weighted_mcp_IDs ); for ( const auto& decision_name : m_hlt2_line_names ) { // individual Hlt trigger lines - bool tos_on_this_line{false}; - std::vector mc_match_fracs( max_candidates ), reco_match_fracs( max_candidates ), - mc_unmatch_fracs( max_candidates ); + bool tos_on_this_line{false}; // Check first if there was a positive trigger decision, then can proceed to TOS matching on the candidate if so // Have to check this as candidates are saved to TES whether decision is positive or not @@ -137,29 +134,25 @@ StatusCode MCTupleToolTOSHLT2::fill( const LHCb::MCParticle*, const LHCb::MCPart << decision_name << endmsg; } - std::map idsByCandidateMap{}; - int iCand = 0; + std::map idsByCandidateMap{}; + int iCand = 0; for ( const auto& cand : *candidates ) { - IDvec id_vec{}; // Upgrade to IDsByTrack after !807 - fetchLHCbIDsFromRecoParticle( *cand, id_vec ); - if ( !idsByCandidateMap.insert( std::pair( id_vec, iCand ) ).second ) { + IDsByTrack ids_by_track{}; + fetchLHCbIDsFromRecoParticle( *cand, ids_by_track ); + if ( !idsByCandidateMap.insert( std::pair( ids_by_track, iCand ) ).second ) { warning() << "Insertion failed. Seems this set of LHCbIDs is already there." << endmsg; } iCand++; } for ( auto const& [trig_cand_IDs, i] : idsByCandidateMap ) { - tos_on_this_line |= - tos_match( trig_cand_IDs, mcp_ID_map, mc_match_fracs, reco_match_fracs, mc_unmatch_fracs ); + tos_on_this_line |= tos_match( trig_cand_IDs, weighted_mcp_IDs ); } } // if candidates this line match the trigger line } // loop over candidates from all lines } else { // Trigger decision is negative tos_on_this_line = false; - mc_match_fracs.emplace_back( 0.f ); - reco_match_fracs.emplace_back( 0.f ); - mc_unmatch_fracs.emplace_back( 1.f ); } if ( msgLevel( MSG::DEBUG ) ) { @@ -167,18 +160,6 @@ StatusCode MCTupleToolTOSHLT2::fill( const LHCb::MCParticle*, const LHCb::MCPart << " on MCParticle with ID " << mcp->particleID() << endmsg; } if ( !tuple->column( prefix + "_" + decision_name + "TOS", tos_on_this_line ) ) { return StatusCode::FAILURE; } - if ( !tuple->farray( prefix + "_" + decision_name + "MCMatchFracs", mc_match_fracs.begin(), mc_match_fracs.end(), - prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - if ( !tuple->farray( prefix + "_" + decision_name + "TOSMatchFracs", reco_match_fracs.begin(), - reco_match_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } - if ( !tuple->farray( prefix + "_" + decision_name + "MCUnMatchFracs", mc_unmatch_fracs.begin(), - mc_unmatch_fracs.end(), prefix + "_" + decision_name + "NCandidates", max_candidates ) ) { - return StatusCode::FAILURE; - } } // Loop over trigger lines // TODO add a total nTOS branch? diff --git a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h index 8c161560..74f849b6 100644 --- a/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h +++ b/Phys/DecayTreeTupleMC/src/MCTupleToolTOSHLT2.h @@ -22,7 +22,7 @@ public: StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, Tuples::Tuple& ) override; private: - void fetchLHCbIDsFromRecoParticle( const LHCb::Particle& part, IDvec& bucket_of_ids ); + void fetchLHCbIDsFromRecoParticle( const LHCb::Particle& part, IDsByTrack& bucket_of_ids ); private: std::vector>> m_candidateHandles; -- GitLab From 6330badfe607224c3f234a83f9207af287ae15c4 Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Thu, 30 Sep 2021 12:01:57 +0200 Subject: [PATCH 53/82] Remove Phys/DecayTreeTupleTracking and Phys/DecayTreeTupleHerschel --- AnalysisSys/tests/refs/configurables.ref | 2 +- CMakeLists.txt | 2 - Phys/DecayTreeTupleHerschel/CMakeLists.txt | 25 - Phys/DecayTreeTupleHerschel/doc/release.notes | 29 - .../src/TupleToolHerschel.cpp | 320 ------ .../src/TupleToolHerschel.h | 90 -- Phys/DecayTreeTupleTracking/CMakeLists.txt | 51 - Phys/DecayTreeTupleTracking/doc/release.notes | 66 -- .../src/TupleToolConeIsolation.cpp | 1021 ----------------- .../src/TupleToolDEDX.cpp | 462 -------- .../src/TupleToolMCAssociatedClusters.cpp | 256 ----- .../src/TupleToolTrackIsolation.cpp | 343 ------ .../src/TupleToolTrackKink.cpp | 286 ----- .../src/TupleToolTrackPosition.cpp | 116 -- .../src/TupleToolTrackTime.cpp | 130 --- .../src/TupleToolVELOClusters.cpp | 87 -- .../src/TupleToolVELOClusters.h | 40 - .../src/TupleToolVeloTrackClusterInfo.cpp | 125 -- .../src/TupleToolVeloTrackMatch.cpp | 343 ------ 19 files changed, 1 insertion(+), 3793 deletions(-) delete mode 100644 Phys/DecayTreeTupleHerschel/CMakeLists.txt delete mode 100644 Phys/DecayTreeTupleHerschel/doc/release.notes delete mode 100644 Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.cpp delete mode 100644 Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.h delete mode 100644 Phys/DecayTreeTupleTracking/CMakeLists.txt delete mode 100644 Phys/DecayTreeTupleTracking/doc/release.notes delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolConeIsolation.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolDEDX.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolMCAssociatedClusters.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolTrackIsolation.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolTrackKink.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolTrackPosition.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolTrackTime.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.h delete mode 100755 Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackClusterInfo.cpp delete mode 100644 Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackMatch.cpp diff --git a/AnalysisSys/tests/refs/configurables.ref b/AnalysisSys/tests/refs/configurables.ref index 5177c463..cbffade8 100644 --- a/AnalysisSys/tests/refs/configurables.ref +++ b/AnalysisSys/tests/refs/configurables.ref @@ -1 +1 @@ -{'DaVinciTrackRefitting': {'RefitParticleTracks': True, 'ParticleRefitter': True, 'TracksFromParticles': True}, 'JetTagging': {'LoKi__MuonTag': True, 'LoKi__SVTag': True, 'LoKi__ElectronTag': True, 'LoKi__TopoTag': True, 'LoKi__TopoTagDir': True, 'LoKi__JetTagTruthNew': True, 'LoKi__JetTagTruthMCPart': True, 'LoKi__SeedFinderNTrks': True, 'LoKi__JetTagTruth': True, 'LoKi__NNBTag': True, 'FilterJet': True, 'LoKi__IPTag': True}, 'DecayTreeTupleDalitz': {'TupleToolDalitz': True, 'MCTupleToolDalitz': True}, 'ParticleMakerChecker': {'ParticleEffPurMoni': True}, 'DecayTreeTupleMuonCalib': {'TupleToolMuonPid': True, 'TupleToolMuonIDCalib': True}, 'DaVinciAssociators': {'ChargedPP2MC': True, 'Particle2MCChi2': True, 'NeutralPP2MC': True, 'CompositeParticle2MCLinks': True, 'Particle2MCWithChi2': True, 'Particle2MCLinks': True, 'TestLinker': True}, 'RichPIDQC': {'JPsiMuMuConf': True, 'KshortPiPiConf': True, 'LambdaToProtonPionConf': True, 'DsToPhiPiConf': True, 'DstarToDzeroPiConf': True, 'RichPIDQCConf': True}, 'DecayTreeTupleBase': {'EventTuple': True, 'MCDecayTreeTuple': True, 'DecayTreeTuple': True, 'TupleToolDecay': True}, 'DaVinciMCTools': {'FilterEventByMCDecay': True, 'MCPrimVertexMaker': True, 'BackgroundCategoryViaRelations': True, 'MCReconstructed': True, 'DaVinciSmartAssociator': True, 'MCParticleMaker': True, 'FilterToFixOppositeBFractions': True, 'MCParticleLinkerMaker': True, 'IsBEvent': True, 'P2MCPFromProtoP': True, 'DumpParticle': True, 'BackgroundCategory': True, 'DaVinciAssociatorsWrapper': True, 'MCParticleArrayFilterAlg': True, 'Particle2BackgroundCategoryRelationsAlg': True, 'PrintDecayTreeTool': True, 'FilterMCParticleArrayByDecay': True}, 'MicroDSTTools': {'CaloHypoCloner': True, 'WeightsVectorCloner': True, 'ParticleCloner': True, 'SwimmingReportCloner': True, 'VertexBaseFromRecVertexCloner': True, 'MuonPIDCloner': True, 'FlavourTagCloner': True, 'VertexBaseFromRecVertexClonerNoTracks': True, 'RecVertexClonerWithTracks': True, 'VertexBaseFromRecVertexClonerWithTracks': True, 'FlavourTagDeepCloner': True, 'MCVertexCloner': True, 'ProtoParticleCloner': True, 'VertexCloner': True, 'TrackCloner': True, 'RecVertexClonerNoTracks': True, 'MCParticleCloner': True, 'RecVertexCloner': True, 'CaloClusterCloner': True}, 'DecayTreeTuple': {'TupleToolVeto': True, 'TupleToolPi0Info': True, 'TupleToolParticleStats': True, 'TupleToolTagging': True, 'TupleToolSubMass': True, 'TupleToolMassHypo': True, 'TupleToolDira': True, 'TupleToolAngles': True, 'TupleToolGeometry': True, 'TupleToolPropertime': True, 'TupleToolDecayTreeFitter': True, 'TupleToolPid': True, 'TupleToolPhotonInfo': True, 'TupleToolP2VV': True, 'TupleToolBremInfo': True, 'TupleToolSelResults': True, 'TupleToolNeutrinoReco': True, 'TupleToolParticleReFit': True, 'TupleToolIsolationTwoBody': True, 'TupleToolVtxIsoln': True, 'TupleToolSwimmingInfo': True, 'TupleToolCaloHypo': True, 'TupleToolKinematic': True}, 'DaVinciTrackScaling': {'TrackSmearState': True, 'OldTrackSmearState': True, 'TrackScaleState': True}, 'Particle2MCTruth': {'MCMatchObjP2MCRelator': True, 'P2MCRelatorAlg': True}, 'DaVinciAngleCalculators': {'P2VVAngleCalculator': True, 'Bs2JpsiPhiAngleCalculator': True, 'Bd2KstarMuMuAngleCalculator': True, 'MCBs2JpsiPhiAngleCalculator': True, 'MCBd2KstarMuMuAngleCalculator': True}, 'LoKiPhysMC': {'LoKi__HepMCParticleMaker': True, 'LoKi__PV2MC': True, 'LoKi__Hybrid__MCTupleTool': True, 'LoKi__PV2MCAlg': True, 'LoKi__P2MCW': True, 'LoKi__Track2MC': True, 'LoKi__P2MC': True}, 'LoKiGenMC': {'LoKi__MC2GenCollisionAlg': True, 'LoKi__HepMC2MC': True, 'LoKi__HepMC2MCAlg': True, 'LoKi__MC2GenCollision': True}, 'VertexFitCheck': {'VtxChecker': True, 'ProperTimeChecker': True, 'CheatedPVReFitter': True, 'PhotonChecker': True, 'PVChecker': True}, 'DecayTreeTupleReco': {'TupleToolPrimaries': True, 'TupleToolTrackInfo': True, 'TupleToolRICHPid': True, 'TupleToolCPU': True, 'TupleToolProtoPData': True, 'TupleToolRecoStats': True}, 'DisplVerticesMC': {'SaveParticlesFrom': True, 'MCDisplVertices': True}, 'Analysis': {'DummyAnalysisAlg': True}, 'FlavourTaggingChecker': {'CheatedSelection': True, 'BDecayTool': True, 'BTaggingInclusive': True, 'BOppositeMonitoring': True, 'BTaggingAnalysis': True, 'TaggingUtilsChecker': True, 'BTaggingChecker': True}, 'HltSelChecker': {'HltCorrelations': True, 'HltBackgroundCategory': True, 'Hlt2Statistics': True, 'FilterTrueTracks': True, 'ReadHltReport': True}, 'DaVinciMonitors': {'ANNPIDTool': True, 'MuonPlotTool': True, 'ParticleMonitor': True, 'MomentumPlotTool': True, 'MassPlotTool': True, 'CombinedPidPlotTool': True, 'MuIDMonitor': True, 'CaloPlotTool': True, 'SimplePlots': True, 'MuEffMonitor': True, 'RichPlotTool': True}, 'DecayTreeTupleANNPID': {'TupleToolANNPIDTraining': True, 'TupleToolANNPID': True}, 'JetAccessoriesMC': {'LoKi__HepMCJets2HepMCJets': True, 'LoKi__HEPMCJetMaker': True, 'LoKi__ParticleMaker': True, 'LoKi__HepMCJets2Jets': True, 'LoKi__HepMCJets2JetsDeltaR': True, 'LoKi__MCJetMaker': True, 'LoKi__MCJets2Jets': True, 'WZPlusJetHepMCSelector': True, 'LoKi__MCPartBHadronSeed': True, 'MCJets2JetsAlg': True, 'LoKi__PartonicJets2HepMCJets': True, 'ZPlusJetHepMCSelector': True}, 'LoKiAlgoMC': {'LoKi__DecayTruth': True, 'LoKi__Hybrid__MCParticleArrayFilter': True}, 'LoKiExample': {'LoKi__Bs2PsiPhi': True, 'LoKi__CCTest': True, 'LoKi__Phi_Makers': True, 'LoKi__Fitters': True, 'LoKi__PhiMC': True, 'LoKi__DecayDescriptor': True, 'LoKi__MCMergedPi0s': True, 'LoKi__Phi': True, 'LoKi__SelectParticles': True, 'LoKi__MemFun': True, 'LoKi__SelectTracks': True, 'LoKi__TestHybrid': True, 'LoKi__GenDecayDescriptor': True, 'LoKi__MCMuons': True, 'LoKi__Track2MCEx': True, 'LoKi__MCSelect': True, 'LoKi__CheckMC_Bs2PsiPhi': True, 'LoKi__PhiK_Dalitz': True, 'LoKi__IPCheck': True, 'LoKi__Example__PV2MCEx': True, 'LoKi__MCDecayDescriptor': True, 'LoKi__TestFunctor': True, 'LoKi__DCCheck': True, 'LoKi__HelloWorld': True, 'LoKi__Bs2PsiPhi_NoMC': True}, 'DecayTreeTupleTracking': {'TupleToolVELOClusters': True, 'TupleToolTrackKink': True, 'TupleToolVeloTrackClusterInfo': True, 'TupleToolVeloTrackMatch': True, 'TupleToolDEDX': True, 'TupleToolTrackIsolation': True, 'TupleToolTrackPosition': True}, 'DecayTreeTupleTrigger': {'TupleToolTISTOS': True, 'TupleToolL0Data': True, 'TupleToolTrigger': True, 'TupleToolStripping': True, 'TupleToolTriggerRecoStats': True, 'TupleToolL0Calo': True, 'TupleToolEventInfo': True}, 'DSTWriters': {'SelDSTWriter': True, 'FixInputCopyStream': True, 'StripDSTWriter': True, 'MicroDSTWriter': True}, 'DecayTreeTupleMC': {'MCTupleToolInteractions': True, 'MCTupleToolPrimaries': True, 'MCTupleToolPID': True, 'MCTupleToolReconstructed': True, 'MCTupleToolPrompt': True, 'MCTupleToolDecayType': True, 'MCTupleToolAngles': True, 'TupleToolGeneration': True, 'TupleToolMCTruth': True, 'TupleToolMCBackgroundInfo': True, 'MCTupleToolKinematic': True, 'MCTupleToolEventType': True, 'MCTupleToolHierarchy': True, 'MCTupleToolP2VV': True}, 'DecayTreeTupleJets': {'TupleToolWZJets': True, 'TupleToolJetTag': True, 'TupleToolJets': True, 'TupleToolJetRelations': True}, 'MicroDSTAlgorithm': {'CopyParticle2TPRelations': True, 'CopySwimmingReports': True, 'CopyParticle2LHCbIDs': True, 'CopyParticle2BackgroundCategory': True, 'CopyGaudiNumbers': True, 'CopyMCHeader': True, 'CopyRecSummary': True, 'CopyPrimaryVertices': True, 'CopyParticle2PVWeightedRelations': True, 'CopyODIN': True, 'CopyParticle2RelatedInfo': True, 'CopyFlavourTag': True, 'CopyParticle2MCRelations': True, 'CopyParticle2PVRelations': True, 'CopyL0DUReport': True, 'CopyParticles': True, 'CopyParticle2TisTosDecisions': True, 'CopyParticle2PVMap': True, 'CopyRecHeader': True, 'CopyMCParticles': True, 'MoveDataObject': True, 'CopyProtoParticles': True, 'CopyPVWeights': True, 'CopyHltDecReports': True}, 'TrackSmearing': {'TrackSmeared': True, 'IpImprover': True}} +{'DaVinciTrackRefitting': {'RefitParticleTracks': True, 'ParticleRefitter': True, 'TracksFromParticles': True}, 'JetTagging': {'LoKi__MuonTag': True, 'LoKi__SVTag': True, 'LoKi__ElectronTag': True, 'LoKi__TopoTag': True, 'LoKi__TopoTagDir': True, 'LoKi__JetTagTruthNew': True, 'LoKi__JetTagTruthMCPart': True, 'LoKi__SeedFinderNTrks': True, 'LoKi__JetTagTruth': True, 'LoKi__NNBTag': True, 'FilterJet': True, 'LoKi__IPTag': True}, 'DecayTreeTupleDalitz': {'TupleToolDalitz': True, 'MCTupleToolDalitz': True}, 'ParticleMakerChecker': {'ParticleEffPurMoni': True}, 'DecayTreeTupleMuonCalib': {'TupleToolMuonPid': True, 'TupleToolMuonIDCalib': True}, 'DaVinciAssociators': {'ChargedPP2MC': True, 'Particle2MCChi2': True, 'NeutralPP2MC': True, 'CompositeParticle2MCLinks': True, 'Particle2MCWithChi2': True, 'Particle2MCLinks': True, 'TestLinker': True}, 'RichPIDQC': {'JPsiMuMuConf': True, 'KshortPiPiConf': True, 'LambdaToProtonPionConf': True, 'DsToPhiPiConf': True, 'DstarToDzeroPiConf': True, 'RichPIDQCConf': True}, 'DecayTreeTupleBase': {'EventTuple': True, 'MCDecayTreeTuple': True, 'DecayTreeTuple': True, 'TupleToolDecay': True}, 'DaVinciMCTools': {'FilterEventByMCDecay': True, 'MCPrimVertexMaker': True, 'BackgroundCategoryViaRelations': True, 'MCReconstructed': True, 'DaVinciSmartAssociator': True, 'MCParticleMaker': True, 'FilterToFixOppositeBFractions': True, 'MCParticleLinkerMaker': True, 'IsBEvent': True, 'P2MCPFromProtoP': True, 'DumpParticle': True, 'BackgroundCategory': True, 'DaVinciAssociatorsWrapper': True, 'MCParticleArrayFilterAlg': True, 'Particle2BackgroundCategoryRelationsAlg': True, 'PrintDecayTreeTool': True, 'FilterMCParticleArrayByDecay': True}, 'MicroDSTTools': {'CaloHypoCloner': True, 'WeightsVectorCloner': True, 'ParticleCloner': True, 'SwimmingReportCloner': True, 'VertexBaseFromRecVertexCloner': True, 'MuonPIDCloner': True, 'FlavourTagCloner': True, 'VertexBaseFromRecVertexClonerNoTracks': True, 'RecVertexClonerWithTracks': True, 'VertexBaseFromRecVertexClonerWithTracks': True, 'FlavourTagDeepCloner': True, 'MCVertexCloner': True, 'ProtoParticleCloner': True, 'VertexCloner': True, 'TrackCloner': True, 'RecVertexClonerNoTracks': True, 'MCParticleCloner': True, 'RecVertexCloner': True, 'CaloClusterCloner': True}, 'DecayTreeTuple': {'TupleToolVeto': True, 'TupleToolPi0Info': True, 'TupleToolParticleStats': True, 'TupleToolTagging': True, 'TupleToolSubMass': True, 'TupleToolMassHypo': True, 'TupleToolDira': True, 'TupleToolAngles': True, 'TupleToolGeometry': True, 'TupleToolPropertime': True, 'TupleToolDecayTreeFitter': True, 'TupleToolPid': True, 'TupleToolPhotonInfo': True, 'TupleToolP2VV': True, 'TupleToolBremInfo': True, 'TupleToolSelResults': True, 'TupleToolNeutrinoReco': True, 'TupleToolParticleReFit': True, 'TupleToolIsolationTwoBody': True, 'TupleToolVtxIsoln': True, 'TupleToolSwimmingInfo': True, 'TupleToolCaloHypo': True, 'TupleToolKinematic': True}, 'DaVinciTrackScaling': {'TrackSmearState': True, 'OldTrackSmearState': True, 'TrackScaleState': True}, 'Particle2MCTruth': {'MCMatchObjP2MCRelator': True, 'P2MCRelatorAlg': True}, 'DaVinciAngleCalculators': {'P2VVAngleCalculator': True, 'Bs2JpsiPhiAngleCalculator': True, 'Bd2KstarMuMuAngleCalculator': True, 'MCBs2JpsiPhiAngleCalculator': True, 'MCBd2KstarMuMuAngleCalculator': True}, 'LoKiPhysMC': {'LoKi__HepMCParticleMaker': True, 'LoKi__PV2MC': True, 'LoKi__Hybrid__MCTupleTool': True, 'LoKi__PV2MCAlg': True, 'LoKi__P2MCW': True, 'LoKi__Track2MC': True, 'LoKi__P2MC': True}, 'LoKiGenMC': {'LoKi__MC2GenCollisionAlg': True, 'LoKi__HepMC2MC': True, 'LoKi__HepMC2MCAlg': True, 'LoKi__MC2GenCollision': True}, 'VertexFitCheck': {'VtxChecker': True, 'ProperTimeChecker': True, 'CheatedPVReFitter': True, 'PhotonChecker': True, 'PVChecker': True}, 'DecayTreeTupleReco': {'TupleToolPrimaries': True, 'TupleToolTrackInfo': True, 'TupleToolRICHPid': True, 'TupleToolCPU': True, 'TupleToolProtoPData': True, 'TupleToolRecoStats': True}, 'DisplVerticesMC': {'SaveParticlesFrom': True, 'MCDisplVertices': True}, 'Analysis': {'DummyAnalysisAlg': True}, 'FlavourTaggingChecker': {'CheatedSelection': True, 'BDecayTool': True, 'BTaggingInclusive': True, 'BOppositeMonitoring': True, 'BTaggingAnalysis': True, 'TaggingUtilsChecker': True, 'BTaggingChecker': True}, 'HltSelChecker': {'HltCorrelations': True, 'HltBackgroundCategory': True, 'Hlt2Statistics': True, 'FilterTrueTracks': True, 'ReadHltReport': True}, 'DaVinciMonitors': {'ANNPIDTool': True, 'MuonPlotTool': True, 'ParticleMonitor': True, 'MomentumPlotTool': True, 'MassPlotTool': True, 'CombinedPidPlotTool': True, 'MuIDMonitor': True, 'CaloPlotTool': True, 'SimplePlots': True, 'MuEffMonitor': True, 'RichPlotTool': True}, 'DecayTreeTupleANNPID': {'TupleToolANNPIDTraining': True, 'TupleToolANNPID': True}, 'JetAccessoriesMC': {'LoKi__HepMCJets2HepMCJets': True, 'LoKi__HEPMCJetMaker': True, 'LoKi__ParticleMaker': True, 'LoKi__HepMCJets2Jets': True, 'LoKi__HepMCJets2JetsDeltaR': True, 'LoKi__MCJetMaker': True, 'LoKi__MCJets2Jets': True, 'WZPlusJetHepMCSelector': True, 'LoKi__MCPartBHadronSeed': True, 'MCJets2JetsAlg': True, 'LoKi__PartonicJets2HepMCJets': True, 'ZPlusJetHepMCSelector': True}, 'LoKiAlgoMC': {'LoKi__DecayTruth': True, 'LoKi__Hybrid__MCParticleArrayFilter': True}, 'LoKiExample': {'LoKi__Bs2PsiPhi': True, 'LoKi__CCTest': True, 'LoKi__Phi_Makers': True, 'LoKi__Fitters': True, 'LoKi__PhiMC': True, 'LoKi__DecayDescriptor': True, 'LoKi__MCMergedPi0s': True, 'LoKi__Phi': True, 'LoKi__SelectParticles': True, 'LoKi__MemFun': True, 'LoKi__SelectTracks': True, 'LoKi__TestHybrid': True, 'LoKi__GenDecayDescriptor': True, 'LoKi__MCMuons': True, 'LoKi__Track2MCEx': True, 'LoKi__MCSelect': True, 'LoKi__CheckMC_Bs2PsiPhi': True, 'LoKi__PhiK_Dalitz': True, 'LoKi__IPCheck': True, 'LoKi__Example__PV2MCEx': True, 'LoKi__MCDecayDescriptor': True, 'LoKi__TestFunctor': True, 'LoKi__DCCheck': True, 'LoKi__HelloWorld': True, 'LoKi__Bs2PsiPhi_NoMC': True}, 'DecayTreeTupleTrigger': {'TupleToolTISTOS': True, 'TupleToolL0Data': True, 'TupleToolTrigger': True, 'TupleToolStripping': True, 'TupleToolTriggerRecoStats': True, 'TupleToolL0Calo': True, 'TupleToolEventInfo': True}, 'DSTWriters': {'SelDSTWriter': True, 'FixInputCopyStream': True, 'StripDSTWriter': True, 'MicroDSTWriter': True}, 'DecayTreeTupleMC': {'MCTupleToolInteractions': True, 'MCTupleToolPrimaries': True, 'MCTupleToolPID': True, 'MCTupleToolReconstructed': True, 'MCTupleToolPrompt': True, 'MCTupleToolDecayType': True, 'MCTupleToolAngles': True, 'TupleToolGeneration': True, 'TupleToolMCTruth': True, 'TupleToolMCBackgroundInfo': True, 'MCTupleToolKinematic': True, 'MCTupleToolEventType': True, 'MCTupleToolHierarchy': True, 'MCTupleToolP2VV': True}, 'DecayTreeTupleJets': {'TupleToolWZJets': True, 'TupleToolJetTag': True, 'TupleToolJets': True, 'TupleToolJetRelations': True}, 'MicroDSTAlgorithm': {'CopyParticle2TPRelations': True, 'CopySwimmingReports': True, 'CopyParticle2LHCbIDs': True, 'CopyParticle2BackgroundCategory': True, 'CopyGaudiNumbers': True, 'CopyMCHeader': True, 'CopyRecSummary': True, 'CopyPrimaryVertices': True, 'CopyParticle2PVWeightedRelations': True, 'CopyODIN': True, 'CopyParticle2RelatedInfo': True, 'CopyFlavourTag': True, 'CopyParticle2MCRelations': True, 'CopyParticle2PVRelations': True, 'CopyL0DUReport': True, 'CopyParticles': True, 'CopyParticle2TisTosDecisions': True, 'CopyParticle2PVMap': True, 'CopyRecHeader': True, 'CopyMCParticles': True, 'MoveDataObject': True, 'CopyProtoParticles': True, 'CopyPVWeights': True, 'CopyHltDecReports': True}, 'TrackSmearing': {'TrackSmeared': True, 'IpImprover': True}} diff --git a/CMakeLists.txt b/CMakeLists.txt index 78f0da63..c2778f07 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,12 +45,10 @@ lhcb_add_subdirectories( Phys/DecayTreeTupleANNPID Phys/DecayTreeTupleBase Phys/DecayTreeTupleDalitz - Phys/DecayTreeTupleHerschel Phys/DecayTreeTupleJets Phys/DecayTreeTupleMC Phys/DecayTreeTupleMuonCalib Phys/DecayTreeTupleReco - Phys/DecayTreeTupleTracking Phys/DecayTreeTupleTrigger Phys/DSTWriters Phys/FunTuple diff --git a/Phys/DecayTreeTupleHerschel/CMakeLists.txt b/Phys/DecayTreeTupleHerschel/CMakeLists.txt deleted file mode 100644 index d83e0359..00000000 --- a/Phys/DecayTreeTupleHerschel/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################### -# (c) Copyright 2000-2021 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. # -############################################################################### -#[=======================================================================[.rst: -Phys/DecayTreeTupleHerschel ---------------------------- -#]=======================================================================] - -gaudi_add_module(DecayTreeTupleHerschel - SOURCES - src/TupleToolHerschel.cpp - LINK - Analysis::DecayTreeTupleBaseLib - LHCb::DAQEventLib - LHCb::DetDescLib - LHCb::DigiEvent - LHCb::LHCbKernel -) diff --git a/Phys/DecayTreeTupleHerschel/doc/release.notes b/Phys/DecayTreeTupleHerschel/doc/release.notes deleted file mode 100644 index 3ebe37c4..00000000 --- a/Phys/DecayTreeTupleHerschel/doc/release.notes +++ /dev/null @@ -1,29 +0,0 @@ -!----------------------------------------------------------------------------- -! Package : Phys/DecayTreeTupleHerschel -! Responsible : Dan Johnson -! Purpose : Tools for Herschel -!----------------------------------------------------------------------------- - -!================= DecayTreeTupleHerschel v1r2 2015-12-03 ==================== - -! 2015-12-03 - Dan Johnson - - Small improvements (no rush to release) - * Remove #include of ToolFactory.h - * Move warning about CorrectedDigits to initialize to avoid large logfiles - -!================= DecayTreeTupleHerschel v1r1 2015-11-02 ==================== - -! 2015-12-02 - Dan Johnson - - change 'adc' from 'unsigned int' to 'int' because with pedestal subtraction - the adc can be negative - -! 2015-12-02 - Dan Johnson - - Update the tuple tool to use the corrected Herschel digits, after - common mode subtraction - -!================= DecayTreeTupleHerschel v1r0 2015-08-06 ==================== - -! 2015-08-06 - Dan Johnson - - First import of the new package and tool: - Tuple tool to convey Herschel ADC counts taken from Herschel raw bank - after decoding with HCRawBankDecoder. diff --git a/Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.cpp b/Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.cpp deleted file mode 100644 index f2f28354..00000000 --- a/Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -// Include files - -// from Gaudi -#include "Event/HCDigit.h" -#include "Event/ODIN.h" -// from LHCb -#include "DetDesc/Condition.h" - -// local -#include "TupleToolHerschel.h" - -DECLARE_COMPONENT( TupleToolHerschel ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolHerschel::TupleToolHerschel( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_cond( nullptr ) { - declareInterface( this ); -} - -StatusCode TupleToolHerschel::initialize() { - StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - // Set up the mapping - m_channels.resize( 5 ); - m_masked.resize( 5 ); - // Check if the mapping is available in the conditions database. - const std::string location = "Conditions/ReadoutConf/HC/Mapping"; - if ( existDet( location ) ) { - registerCondition( location, m_cond, &TupleToolHerschel::cacheMapping ); - // First update. - sc = updMgrSvc()->update( this ); - if ( sc.isFailure() ) { return Error( "Cannot update mapping.", StatusCode::FAILURE ); } - } else { - warning() << "Cannot find " << location << " in database" << endmsg; - mapChannels( m_channelsB0, m_sparesB0, m_masksB0, 0, true ); - mapChannels( m_channelsB1, m_sparesB1, m_masksB1, 1, true ); - mapChannels( m_channelsB2, m_sparesB2, m_masksB2, 2, true ); - mapChannels( m_channelsF1, m_sparesF1, m_masksF1, 1, false ); - mapChannels( m_channelsF2, m_sparesF2, m_masksF2, 2, false ); - } - printMapping(); - - // Check if the FOM parameters are available in the conditions database. - const std::string location_fom = "Conditions/Calibration/HC/FigureOfMerit_SimpleChi2"; - if ( existDet( location_fom ) ) { - registerCondition( location_fom, m_condFOM, &TupleToolHerschel::cacheFOMParameters ); - // First update. - sc = updMgrSvc()->update( this ); - if ( sc.isFailure() ) { return Error( "Cannot update FOM constants." ); } - } else { - warning() << "Cannot find " << location_fom << " in database." << endmsg; - _makeFOM = false; - warning() << "Cannot set FOM constants, will not create Herschel FOM in NTuple. Please fix FOM constants location " - "in CondDB." - << endmsg; - //} - } - - return sc; -} - -//============================================================================= -// Update the channel map using the conditions database. -//============================================================================= -StatusCode TupleToolHerschel::cacheMapping() { - - m_crateB = m_cond->param( "CrateB" ); - m_crateF = m_cond->param( "CrateF" ); - - m_channelsB0 = m_cond->paramVect( "ChannelsB0" ); - m_channelsB1 = m_cond->paramVect( "ChannelsB1" ); - m_channelsB2 = m_cond->paramVect( "ChannelsB2" ); - m_channelsF1 = m_cond->paramVect( "ChannelsF1" ); - m_channelsF2 = m_cond->paramVect( "ChannelsF2" ); - - m_sparesB0 = m_cond->paramVect( "ReferenceChannelsB0" ); - m_sparesB1 = m_cond->paramVect( "ReferenceChannelsB1" ); - m_sparesB2 = m_cond->paramVect( "ReferenceChannelsB2" ); - m_sparesF1 = m_cond->paramVect( "ReferenceChannelsF1" ); - m_sparesF2 = m_cond->paramVect( "ReferenceChannelsF2" ); - - m_masksB0 = m_cond->paramVect( "MasksB0" ); - m_masksB1 = m_cond->paramVect( "MasksB1" ); - m_masksB2 = m_cond->paramVect( "MasksB2" ); - m_masksF1 = m_cond->paramVect( "MasksF1" ); - m_masksF2 = m_cond->paramVect( "MasksF2" ); - - mapChannels( m_channelsB0, m_sparesB0, m_masksB0, 0, true ); - mapChannels( m_channelsB1, m_sparesB1, m_masksB1, 1, true ); - mapChannels( m_channelsB2, m_sparesB2, m_masksB2, 2, true ); - mapChannels( m_channelsF1, m_sparesF1, m_masksF1, 1, false ); - mapChannels( m_channelsF2, m_sparesF2, m_masksF2, 2, false ); - return StatusCode::SUCCESS; -} - -//============================================================================= -// Setup the channel map for a given station. -//============================================================================= -bool TupleToolHerschel::mapChannels( const std::vector& channels, const std::vector& refs, - const std::vector& masks, const unsigned int station, const bool bwd ) { - - const unsigned int offset = bwd ? 0 : 2; - // Check if the input is valid. - if ( channels.size() != 4 || refs.size() != 4 || masks.size() != 4 ) { - std::string s = bwd ? "B" : "F"; - s += std::to_string( station ); - warning() << "Invalid channel map for station " << s << ". Masking all quadrants." << endmsg; - m_channels[station + offset].assign( 4, 0 ); - m_masked[station + offset].assign( 4, true ); - return false; - } - - const unsigned int crate = bwd ? m_crateB : m_crateF; - m_channels[station + offset].resize( 4 ); - m_masked[station + offset].resize( 4 ); - for ( unsigned int i = 0; i < 4; ++i ) { - if ( channels[i] < 0 ) { - std::string s = bwd ? "B" : "F"; - s += std::to_string( station ); - warning() << "Invalid channel number " << channels[i] << ". Masking quadrant " << s << i << endmsg; - m_masked[station + offset][i] = true; - continue; - } - m_channels[station + offset][i] = ( crate << 6 ) | channels[i]; - m_masked[station + offset][i] = masks[i] != 0; - } - return true; -} - -//============================================================================= -// Print the channel map for information -//============================================================================= -void TupleToolHerschel::printMapping() const { - - info() << " Quadrant ID Ref. ID Comment" << endmsg; - const std::vector stations = {"B0", "B1", "B2", "F1", "F2"}; - const unsigned int nStations = stations.size(); - for ( unsigned int i = 0; i < nStations; ++i ) { - for ( unsigned int j = 0; j < 4; ++j ) { - const std::string comment = m_masked[i][j] ? "Masked" : ""; - info() << format( " %2s/%1d", stations[i].c_str(), j ) << format( " %4d", m_channels[i][j] ) - << format( " %-10s", comment.c_str() ) << endmsg; - } - } -} - -//============================================================================= -// Retrieve the FOM parameters from the conditions database. -//============================================================================= -StatusCode TupleToolHerschel::cacheFOMParameters() { - info() << "Updating HRC figure of merit parameters." << endmsg; - m_hrcFomVnum = m_condFOM->param( "FOMvNum" ); - info() << "HRC FOM version number " << m_hrcFomVnum << endmsg; - - m_meanConfig.clear(); - m_rmsConfig.clear(); - const std::vector stations = {"B0", "B1", "B2", "F1", "F2"}; - for ( const auto& st : stations ) { - const auto meanEven = m_condFOM->paramVect( "Mean" + st + "Even" ); - const auto meanOdd = m_condFOM->paramVect( "Mean" + st + "Odd" ); - const auto rmsEven = m_condFOM->paramVect( "RMS" + st + "Even" ); - const auto rmsOdd = m_condFOM->paramVect( "RMS" + st + "Odd" ); - for ( unsigned int i = 0; i < 4; ++i ) { - m_meanConfig.push_back( meanEven[i] ); - m_meanConfig.push_back( meanOdd[i] ); - m_rmsConfig.push_back( rmsEven[i] ); - m_rmsConfig.push_back( rmsOdd[i] ); - } - } - return setFOMParameters(); -} - -//============================================================================= -// Update the calibration constants. -//============================================================================= -StatusCode TupleToolHerschel::setFOMParameters() { - - const unsigned int nStations = 5; - const unsigned int nQuadrants = 4; - // Check if the lists of calibration constants have the right size. - const unsigned int nExpectedSize = nStations * 4 * 2; - if ( m_meanConfig.size() != nExpectedSize || m_rmsConfig.size() != nExpectedSize ) { - return Error( "List of FOM calibration constants has incorrect size." ); - } - m_mean.resize( nStations ); - m_rms.resize( nStations ); - unsigned int index = 0; - for ( unsigned int i = 0; i < nStations; ++i ) { - m_mean[i].resize( nQuadrants ); - m_rms[i].resize( nQuadrants ); - for ( unsigned int j = 0; j < nQuadrants; ++j ) { - m_mean[i][j].resize( 2 ); - m_rms[i][j].resize( 2 ); - for ( unsigned int k = 0; k < 2; ++k ) { - m_mean[i][j][k] = m_meanConfig[index]; - m_rms[i][j][k] = m_rmsConfig[index]; - ++index; - } - } - } - return StatusCode::SUCCESS; -} - -//============================================================================= -StatusCode TupleToolHerschel::fill( Tuples::Tuple& tup ) { - const std::string prefix = fullName(); - - // Get ODIN - const LHCb::ODIN* odin = getIfExists( evtSvc(), LHCb::ODINLocation::Default ); - if ( !odin ) { odin = getIfExists( evtSvc(), LHCb::ODINLocation::Default, false ); } - if ( !odin ) { - // should always be available ... - return Error( "Cannot load the ODIN data object", StatusCode::SUCCESS ); - } - const unsigned int bxid = odin->bunchId(); - const unsigned int parity = bxid % 2; - - // Get Herschel digits - LHCb::HCDigits* digits = getIfExists( m_DigitsLocation ); - if ( !digits ) { - // should always be available ... - return Error( "Cannot load the HCDigits data object", StatusCode::SUCCESS ); - } - - // Fill the Herschel information - double log_hrc_fom = -999; - double log_hrc_fom_B = -999; - double log_hrc_fom_F = -999; - double hrc_fom = 0.; - double hrc_fom_B = 0.; - double hrc_fom_F = 0.; - - // Herschel FOM : log( sum( chi2 )) - bool test = true; - const std::vector stations = {"B0", "B1", "B2", "F1", "F2"}; - const unsigned int nStations = 5; - for ( unsigned int i = 0; i < nStations; ++i ) { - for ( unsigned int j = 0; j < 4; ++j ) { - // Build channel name - const std::string ch = stations[i] + std::to_string( j ); - LHCb::HCCellID id( m_channels[i][j] ); - const LHCb::HCDigit* digit = digits->object( id ); - - // Create a value of ADC to write out every event, irrespective of whether a HCdigit is found - int adc = -999; - - // If a digit is found *and* the channel is not masked - if ( digit && !m_masked[i][j] ) { - adc = digit->adc(); - - // Make Herschel FOM - if ( _makeFOM ) { - // A counter is to be ignored if the width is set to <0: - if ( m_rms[i][j][parity] > 0.0 ) { - - double quadrant_pull = ( adc - m_mean[i][j][parity] ) / m_rms[i][j][parity]; - hrc_fom += quadrant_pull * quadrant_pull; - - // Make Herschel FOM for B-side and F-side separately - if ( i < 3 ) - hrc_fom_B += quadrant_pull * quadrant_pull; - else - hrc_fom_F += quadrant_pull * quadrant_pull; - } - } else { - hrc_fom = -999.; - hrc_fom_B = -999.; - hrc_fom_F = -999.; - } - } else if ( !digit ) { - Warning( "Cannot retrieve digit for " + ch, StatusCode::SUCCESS, 50 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - } else { - warning() << "Channel " << ch << " is masked." << endmsg; - } - - // Always write out the ADC - test &= tup->column( prefix + ch, adc ); - } - } - - if ( hrc_fom > 0 ) log_hrc_fom = std::log( hrc_fom ); - if ( hrc_fom_B > 0 ) log_hrc_fom_B = std::log( hrc_fom_B ); - if ( hrc_fom_F > 0 ) log_hrc_fom_F = std::log( hrc_fom_F ); - test &= tup->column( prefix + "log_hrc_fom" + "_v" + std::to_string( m_hrcFomVnum ), log_hrc_fom ); - test &= tup->column( prefix + "log_hrc_fom_B" + "_v" + std::to_string( m_hrcFomVnum ), log_hrc_fom_B ); - test &= tup->column( prefix + "log_hrc_fom_F" + "_v" + std::to_string( m_hrcFomVnum ), log_hrc_fom_F ); - - // Fill ADC vectors - std::vector adcB, adcF; - for ( const LHCb::HCDigit* dig : *digits ) { - const int cell = int( dig->cellID().cellID() ); - const int crate = cell >> 6; - if ( crate == 0 ) { - adcB.push_back( (double)dig->adc() ); - } else if ( crate == 1 ) { - adcF.push_back( (double)dig->adc() ); - } else { - info() << "Crate = " << crate << ". We have a problem." << endmsg; - } - } - - // Fill tuple - test &= tup->farray( prefix + "adc_B", adcB.begin(), adcB.end(), prefix + "nchB", 1000 ); - test &= tup->farray( prefix + "adc_F", adcF.begin(), adcF.end(), prefix + "nchF", 1000 ); - - return StatusCode( test ); -} diff --git a/Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.h b/Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.h deleted file mode 100644 index 3b62cbfb..00000000 --- a/Phys/DecayTreeTupleHerschel/src/TupleToolHerschel.h +++ /dev/null @@ -1,90 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#ifndef TUPLETOOLHERSCHEL_H -#define TUPLETOOLHERSCHEL_H 1 - -// Include files -// from Gaudi -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IEventTupleTool.h" // Interface - -/** @class TupleToolHerschel TupleToolHerschel.h - * - * Fills Herschel information. - * - * @author Dan Johnson - * @date 2015-07-08 - */ -class TupleToolHerschel : public TupleToolBase, virtual public IEventTupleTool { - -public: - /// Standard constructor - TupleToolHerschel( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; ///< Algorithm initialization - StatusCode fill( Tuples::Tuple& ) override; ///< Fill tuple - - Gaudi::Property m_DigitsLocation{this, "DigitsLocation", "Raw/HC/Digits", - "TES location of Herschel digits"}; - // Mappings (to be retrieved from conditions database). - Gaudi::Property m_crateB{this, "CrateB", 0, "Number of B-side crate"}; - Gaudi::Property m_crateF{this, "CrateF", 1, "Number of F-side crate"}; - - Gaudi::Property> m_masksB0{this, "MasksB0", {false, false, false, false}, "B0 masking"}; - Gaudi::Property> m_masksB1{this, "MasksB1", {false, false, false, false}, "B1 masking"}; - Gaudi::Property> m_masksB2{this, "MasksB2", {false, false, false, false}, "B2 masking"}; - Gaudi::Property> m_masksF1{this, "MasksF1", {false, false, false, false}, "F1 masking"}; - Gaudi::Property> m_masksF2{this, "MasksF2", {false, false, false, false}, "F2 masking"}; - - Gaudi::Property> m_channelsB0{this, "ChannelsB0", {}, "B0 channels"}; - Gaudi::Property> m_channelsB1{this, "ChannelsB1", {}, "B1 channels"}; - Gaudi::Property> m_channelsB2{this, "ChannelsB2", {}, "B2 channels"}; - Gaudi::Property> m_channelsF1{this, "ChannelsF1", {}, "F1 channels"}; - Gaudi::Property> m_channelsF2{this, "ChannelsF2", {}, "F2 channels"}; - - Gaudi::Property> m_sparesB0{this, "SpareChannelsB0", {}, "B0 spare channels"}; - Gaudi::Property> m_sparesB1{this, "SpareChannelsB1", {}, "B1 spare channels"}; - Gaudi::Property> m_sparesB2{this, "SpareChannelsB2", {}, "B2 spare channels"}; - Gaudi::Property> m_sparesF1{this, "SpareChannelsF1", {}, "F1 spare channels"}; - Gaudi::Property> m_sparesF2{this, "SpareChannelsF2", {}, "F2 spare channels"}; - -protected: - /// Conditions database information - Condition* m_cond; - Condition* m_condFOM = nullptr; - - /// Channel numbers for each quadrant - std::vector> m_channels; - /// Masked flags for each quadrant - std::vector> m_masked; - /// Retrieve the mapping from the conditions database. - StatusCode cacheMapping(); - /// Setup the mapping for a given station. - bool mapChannels( const std::vector& channels, const std::vector& refs, const std::vector& masks, - const unsigned int station, const bool bwd ); - /// Print the channel mapping for information. - void printMapping() const; - - StatusCode cacheFOMParameters(); - StatusCode setFOMParameters(); - - /// FOM constants for each channel and parity - /// station (x5) ; quadrant (x4) ; parity (x2) - std::vector>> m_mean; - std::vector>> m_rms; - bool _makeFOM = true; - - // Input parameters from CondDB - std::vector m_meanConfig; - std::vector m_rmsConfig; - int m_hrcFomVnum; -}; - -#endif diff --git a/Phys/DecayTreeTupleTracking/CMakeLists.txt b/Phys/DecayTreeTupleTracking/CMakeLists.txt deleted file mode 100644 index f390266b..00000000 --- a/Phys/DecayTreeTupleTracking/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -############################################################################### -# (c) Copyright 2000-2021 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. # -############################################################################### -#[=======================================================================[.rst: -Phys/DecayTreeTupleTracking ---------------------------- -#]=======================================================================] - -gaudi_add_module(DecayTreeTupleTracking - SOURCES - src/TupleToolConeIsolation.cpp - src/TupleToolDEDX.cpp - src/TupleToolMCAssociatedClusters.cpp - src/TupleToolTrackIsolation.cpp - src/TupleToolTrackKink.cpp - src/TupleToolTrackPosition.cpp - src/TupleToolTrackTime.cpp - src/TupleToolVELOClusters.cpp - src/TupleToolVeloTrackClusterInfo.cpp - src/TupleToolVeloTrackMatch.cpp - LINK - Analysis::DecayTreeTupleBaseLib - Boost::headers - Gaudi::GaudiAlgLib - Gaudi::GaudiKernel - GSL::gsl - LHCb::DAQEventLib - LHCb::DigiEvent - LHCb::FTEvent - LHCb::LHCbKernel - LHCb::LHCbMathLib - LHCb::LinkerEvent - LHCb::MCEvent - LHCb::MCInterfaces - LHCb::PhysEvent - LHCb::PhysInterfacesLib - LHCb::TrackEvent - Phys::DaVinciInterfacesLib - Phys::DaVinciMCKernelLib - Rangev3::rangev3 - Rec::TrackFitEvent - Rec::TrackInterfacesLib - Rec::TrackKernel -) diff --git a/Phys/DecayTreeTupleTracking/doc/release.notes b/Phys/DecayTreeTupleTracking/doc/release.notes deleted file mode 100644 index 63d86951..00000000 --- a/Phys/DecayTreeTupleTracking/doc/release.notes +++ /dev/null @@ -1,66 +0,0 @@ -!----------------------------------------------------------------------------- -! Package : Phys/DecayTreeTupleTracking -! Responsible : Chris Jones -! Purpose : -!----------------------------------------------------------------------------- - -! 2016-12-05 - Olli Lupton - - TupleToolConeIsolation: force |cos| <= 1 to avoid aborts caused by numerical - instabilities. - -!================= DecayTreeTupleTracking v1r6 2016-03-29 ==================== - -! 2016-03-21 - Eduardo Rodrigues - - TupleToolConeIsolation.cpp: removed unused variable to get rid of compilation warning. - -! 2016-03-14 - Adlene Hicheur - - Updating TupleToolConeIsolation to deal with pi0s of partially reconstructed backgrounds - -!================= DecayTreeTupleTracking v1r5 2016-03-07 ==================== - -! 2016-03-03 - Francesco Dettori - - Adding TupleToolTrackTime, which computes the average residual time of a track from OT hits - -!================= DecayTreeTupleTracking v1r4 2015-11-30 ==================== - -! 2015-11-01 - Gerhard Raven - - replace endreq with endmsg - -!================= DecayTreeTupleTracking v1r3 2015-10-22 ==================== - -! 2015-08-28 - Chris Jones - - use target() not data() - -!================= DecayTreeTupleTracking v1r2 2015-02-26 ==================== - -! 2015-02-19 - Simone Bifani - - Added TupleToolConeIsolation. Extension of TupleToolTrackIsolation that includes - neutral cone and extra isolation variables - -!========================= DecayTreeTupleTracking v1r1 2014-02-20 ========================= - -! 2014-02-04 - Francesco Dettori - - Fixed bug in TupleToolTrackKink. An Error message replaced by a Warning - ignored not to stop the algorithm. - -! 2013-12-20 - Marco Clemencic - - Fixed CMake configuration. - -!========================= DecayTreeTupleTracking v1r0 2013-12-18 ========================= - -! 2013-12-10 - Andrea Contu - - Minor change in TupleTollVeloTrackMatch, added property for maxIP of VELO tracks - -! 2013-11-25 - Andrea Contu - - Minor change in TupleTollVeloTrackMatch, one property has been renamed. - -! 2013-11-21 - Andrea Contu - - Added TupleToolVeloTrackMatch. It fills variables related to the matching - of a velo track to a downstream composite condidate. - -! 2013-11-15 - Chris Jones - - First version. Move the tracking specific tools from DecayTreeTupleReco - into this dedicatd package. Imported :- - TupleToolDEDX, TupleToolTrackIsolation, TupleToolTrackKink, - TupleToolTrackPosition, TupleToolVELOClusters, - TupleToolVeloTrackClusterInfo diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolConeIsolation.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolConeIsolation.cpp deleted file mode 100644 index cfe35448..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolConeIsolation.cpp +++ /dev/null @@ -1,1021 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" - -#include "Event/Particle.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/PhysicalConstants.h" - -#include - -/** @class TupleToolConeIsolation TupleToolConeIsolation.h - * - * \brief Fill track isolation for DecayTreeTuple. - * Open an eta-phi cone around the head, exclude all tracks that are in the decay descriptor (i.e. that belong to the - * decay you are looking for), and build variables with the remaining tracks - * - * Options: - * - * - MinConeSize: set the minimum cone size (default = 0.4) - * - MaxConeSize: set the maximum cone size (default = 0.6) - * - SizeStep: set the cone size step between two iterations (default = 0.1) - * - FillCharged: flag to fill the charged cone (default = true) - * - ExtraParticlesLocation: set the type of particles that are considered in the charged cone (default = - * "Phys/StdAllNoPIDsMuons/Particles") - * - TrackType: set the type of tracks that are considered in the charged cone (default = 3) - * - FillNeutral: flag to fill the neutral cone (default = true) - * - ExtraPhotonsLocation: set the type of particles that are considered in the neutral cone (default = - * "Phys/StdLooseAllPhotons/Particles") - * - FillAsymmetry: flag to fill the asymmetry variables (default = false) - * - FillDeltas: flag to fill the delta variables (default = false) - * - FillIsolation: flag to fill the isolation variables (default = true) - * - FillMaxPt: flag to fill the momentum of the max-pT object in the cone (default = true) - * - MaxPtParticleLocation: set the type of max-pT particles that are considered in the charged cone (default = - * "Phys/StdAllLooseMuons/Particles") - * - FillComponents: flag to fill the components of all variables (default = false) - * - FillPi0Info: flag to fill the resolved pi0 info (default = false) - * - FillMergedPi0Info: flag to fill the merged pi0 info (default = false) - * - PizerosLocation: set the resolved pi0 type considered for combination with the seed (default = - * Phys/StdLoosePi02gg/Particles) - * - MergedPizerosLocation: set the merged pi0 type considered for combination with the seed (default = - * Phys/StdLooseMergedPi0/Particles) - * - MinhPi0Mass: Set the lower seed-Pi0 invariant mass cut (default = 0 MeV) - * - MaxhPi0Mass: Set the upper seed-Pi0 invariant mass cut (default = 5000 MeV) - * - * If Verbose, all options are set to true - * - * Cone prefix: - * - * - head_cc: charged cone - * - head_nc: neutral cone - * - * The pi0 variables are not dependent on the cone size - * - * Variables (XX = cc or nc): - * - * - head_XX_mult : number of objects inside the cone - * - head_XX_sPT : scalar-summed pT of the objects inside the cone - * - head_XX_vPT : vector-summed pT of the objects inside the cone - * - head_XX_P : x, y and z components of the cone momentum - * - * - head_XX_asy_P : momentum asymmetry between the head and the cone defined as (head_P - head_XX_P) / (head_P + - * head_XX_P) - * - head_XX_asy_P : x, y, z and transverse components of the momentum asymmetry - * - * - head_XX_deltaEta : difference in eta between the head and the cone - * - head_XX_deltaPhi : difference in phi between the head and the cone - * - * - head_XX_IT : transverse isolation of the head in the cone, defined as head_PT / (head_P + head_XX_P)_T - * - head_IT : transverse isolation of the head in the charged and neutral cones, defined as head_PT / (head_P + - * head_cc_P + head_nc_P)_T - * - * - head_cc_maxPt_Q : charge of the max-pT object in the charged cone - * - head_XX_maxPt_P : x, y, z (and e) components of the max-pT object momentum in the cone - * - head_MasshPi0: invariant mass of the seed-Pi0 combinations - * - head_Pi0_DeltaR: DeltaR between the seed and the pi0 directions - * - head_Pi0_E, head_Pi0_PX, head_Pi0_PY, head_Pi0_PZ: four momentum of the pi0 - * - head_Pi0_M: invariant mass of the pi0 - * - head_Pi0Ph1_CL, head_Pi0Ph2_CL: confidence levels of the (photon) pi0 daughters - * - For the merged pi0, the names of the variables are labelled replacing Pi0 by MergPi0 - * - * \sa DecayTreeTuple, TupleToolTrackIsolation - * - * @author Simone Bifani, Michel De Cian, Adlene Hicheur - * @date 2016-03-10 - * - */ -class TupleToolConeIsolation : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolConeIsolation( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - - /// Loop over different cone sizes and fill the variables into the tuple - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - double m_minConeSize; - double m_maxConeSize; - double m_sizeStep; - double m_MinhPi0Mass; - double m_MaxhPi0Mass; - - std::string m_extraParticlesLocation; - std::string m_maxPtParticleLocation; - std::string m_extraPhotonsLocation; - std::string m_PizerosLocation; - std::string m_MergedPizerosLocation; - - int m_trackType; - - bool m_fillCharged; - bool m_fillNeutral; - bool m_fillPi0Info; - bool m_fillMergedPi0Info; - bool m_fillAsymmetry; - bool m_fillDeltas; - bool m_fillIsolation; - bool m_fillMaxPt; - - bool m_fillComponents; - - std::vector m_decayParticles; - - /// Save all the particles in the decay descriptor in a vector - void saveDecayParticles( const LHCb::Particle* top ); - - /// Calculate properties of the charged cone - StatusCode ChargedCone( const LHCb::Particle* seed, const LHCb::Particles* parts, const LHCb::Particles* maxPts, - const double rcut, int& multiplicity, double& scalarPt, std::vector& momentum, - std::vector& maxPt ); - - /// Calculate properties of the neutral cone - StatusCode NeutralCone( const LHCb::Particle* seed, const LHCb::Particles* photons, const double rcut, - int& multiplicity, double& scalarPt, std::vector& momentum, - std::vector& maxPt, double& AvConfLevel, double& MaxConfLevel, double& LR1, - double& LR2, double& LR3, double& LR4 ); - - /// Check if a track belongs to the decay - bool isTrackInDecay( const LHCb::Track* track ); - - // fill pi0-track mass info - StatusCode pi0Comb( const LHCb::Particle* seed, const LHCb::Particles* pi0s, int& multiplicity, - std::vector& InvMass, std::vector& Pi0PX, std::vector& Pi0PY, - std::vector& Pi0PZ, std::vector& Pi0E, std::vector& Pi0M, - std::vector& Pi0DeltaR, std::vector& Pi0Photon1CL, - std::vector& Pi0Photon2CL ); - - mutable Gaudi::Accumulators::Counter<> m_cosTooBigCounter{this, "Forced cos > 1 to 1"}; - mutable Gaudi::Accumulators::Counter<> m_cosTooLowCounter{this, "Forced cos < -1 to -1"}; -}; - -#define MAXNPIZEROS 1000 - -// Declaration of the Algorithm Factory -DECLARE_COMPONENT( TupleToolConeIsolation ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolConeIsolation::TupleToolConeIsolation( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - - declareInterface( this ); - - declareProperty( "MinConeSize", m_minConeSize = 0.4, "Set the minimum cone size (default = 0.4)" ); - declareProperty( "MaxConeSize", m_maxConeSize = 0.6, "Set the maximum cone size (default = 0.6)" ); - declareProperty( "SizeStep", m_sizeStep = 0.1, "Set the cone size step between two iterations (default = 0.1)" ); - declareProperty( "MinhPi0Mass", m_MinhPi0Mass = 0 * Gaudi::Units::MeV, - "Set the lower seed-Pi0 invariant mass cut (default = 0 MeV)" ); - declareProperty( "MaxhPi0Mass", m_MaxhPi0Mass = 5000 * Gaudi::Units::MeV, - "Set the upper seed-Pi0 invariant mass cut (default = 5000 MeV)" ); - declareProperty( "FillCharged", m_fillCharged = true, "Flag to fill the charged cone (default = true)" ); - declareProperty( "ExtraParticlesLocation", m_extraParticlesLocation = "Phys/StdAllNoPIDsMuons/Particles", - "Set the type of particles that are considered in the charged cone (default = " - "Phys/StdAllNoPIDsMuons/Particles)" ); - declareProperty( "TrackType", m_trackType = 3, - "Set the type of tracks that are considered in the cone (default = 3)" ); - - declareProperty( "FillNeutral", m_fillNeutral = true, "Flag to fill the neutral cone (default = true)" ); - declareProperty( "ExtraPhotonsLocation", m_extraPhotonsLocation = "Phys/StdLooseAllPhotons/Particles", - "Set the type of particles that are considered in the neutral cone (default = " - "Phys/StdLooseAllPhotons/Particles)" ); - declareProperty( "FillPi0Info", m_fillPi0Info = false, "Flag to fill the pi0 info (default = false)" ); - declareProperty( "FillMergedPi0Info", m_fillMergedPi0Info = false, - "Flag to fill the merged pi0 info (default = true)" ); - declareProperty( "PizerosLocation", m_PizerosLocation = "Phys/StdLoosePi02gg/Particles", - "Set the type of pi0s that are considered (default = Phys/StdLoosePi02gg/Particles)" ); - declareProperty( "MergedPizerosLocation", m_MergedPizerosLocation = "Phys/StdLooseMergedPi0/Particles", - "Set the type of merged pi0s that are considered (default = Phys/StdLooseMergedPi0/Particles)" ); - declareProperty( "FillAsymmetry", m_fillAsymmetry = false, "Flag to fill the asymmetry variables (default = false)" ); - declareProperty( "FillDeltas", m_fillDeltas = false, "Flag to fill the delta variables (default = false)" ); - declareProperty( "FillIsolation", m_fillIsolation = true, "Flag to fill the isolation variables (default = true)" ); - declareProperty( "FillMaxPt", m_fillMaxPt = true, - "Flag to fill the momentum of the max-pT object in the cone (default = true)" ); - declareProperty( "MaxPtParticlesLocation", m_maxPtParticleLocation = "Phys/StdAllLooseMuons/Particles", - "Set the type of max-pT particles that are considered in the charged cone (default = " - "Phys/StdAllLooseMuons/Particles)" ); - - declareProperty( "FillComponents", m_fillComponents = false, - "Flag to fill the components of all relevant variables (default = false)" ); -} - -//============================================================================= -// Initialization -//============================================================================= -StatusCode TupleToolConeIsolation::initialize() { - - StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - if ( !m_fillCharged && !m_fillNeutral ) { - if ( msgLevel( MSG::FATAL ) ) fatal() << "No cone to fill" << endmsg; - return StatusCode::FAILURE; - } - - if ( m_minConeSize > m_maxConeSize ) { - if ( msgLevel( MSG::FATAL ) ) fatal() << "Max conesize smaller than min conesize" << endmsg; - return StatusCode::FAILURE; - } - - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; - - if ( isVerbose() ) { - m_fillCharged = true; - m_fillNeutral = true; - m_fillAsymmetry = true; - m_fillDeltas = true; - m_fillIsolation = true; - m_fillMaxPt = true; - } - - return StatusCode::SUCCESS; -} -//============================================================================= -// Fill the tuple -//============================================================================= -StatusCode TupleToolConeIsolation::fill( const LHCb::Particle* top, const LHCb::Particle* seed, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& ) { - - const std::string prefix = fullName( head ); - - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Fill" << endmsg; - - // -- The vector m_decayParticles contains all the particles that belong to the given decay according to the decay - // descriptor. - - // -- Clear the vector with the particles in the specific decay - m_decayParticles.clear(); - - // -- Add the mother (prefix of the decay chain) to the vector - if ( msgLevel( MSG::DEBUG ) ) debug() << "Filling particle with ID " << top->particleID().pid() << endmsg; - m_decayParticles.push_back( top ); - - // -- Save all particles that belong to the given decay in the vector m_decayParticles - saveDecayParticles( top ); - - // -- Check particle containers - const LHCb::Particles* parts = get( m_extraParticlesLocation ); - if ( m_fillCharged ) - if ( parts->size() == 0 ) - if ( msgLevel( MSG::WARNING ) ) warning() << "Could not retrieve extra-particles... Skipping" << endmsg; - const LHCb::Particles* maxPts = get( m_maxPtParticleLocation ); - if ( m_fillMaxPt ) - if ( maxPts->size() == 0 ) - if ( msgLevel( MSG::WARNING ) ) warning() << "Could not retrieve maxPt-particle... Skipping" << endmsg; - const LHCb::Particles* photons = NULL; - if ( exist( m_extraPhotonsLocation ) ) { - photons = get( m_extraPhotonsLocation ); - if ( m_fillNeutral ) - if ( photons->size() == 0 ) - if ( msgLevel( MSG::WARNING ) ) warning() << "Could not retrieve extra-photons... Skipping" << endmsg; - } else { - - warning() << m_extraPhotonsLocation << " Not available" << endmsg; - } - - const LHCb::Particles* pizeros = NULL; - if ( exist( m_PizerosLocation ) ) { - pizeros = get( m_PizerosLocation ); - if ( m_fillPi0Info ) - if ( pizeros->size() == 0 ) - if ( msgLevel( MSG::WARNING ) ) warning() << "Could not retrieve pi0s... Skipping" << endmsg; - } else { - - warning() << m_PizerosLocation << " Not available" << endmsg; - } - - const LHCb::Particles* mergedpizeros = NULL; - if ( exist( m_MergedPizerosLocation ) ) { - mergedpizeros = get( m_MergedPizerosLocation ); - if ( m_fillMergedPi0Info ) - if ( mergedpizeros->size() == 0 ) - if ( msgLevel( MSG::WARNING ) ) warning() << "Could not retrieve merged pi0s... Skipping" << endmsg; - } else { - - warning() << m_MergedPizerosLocation << " Not available" << endmsg; - } - - bool test = true; - - if ( seed ) { - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Start looping through different conesizes" << endmsg; - - // -- Loop over the different conesizes - double coneSize = m_minConeSize; - while ( coneSize <= m_maxConeSize ) { - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Filling variables with conesize " << coneSize << endmsg; - - // -- Convert the conesize to a string - // -- Convert the conesize to a string (and don't forget space for the terminating '\0'!) - char coneNumber[5]; - sprintf( coneNumber, "%.2f", coneSize ); - std::string conesize( coneNumber ); - - // -- Charged cone - Gaudi::XYZVector ccP; - if ( m_fillCharged ) { - if ( parts->size() != 0 ) { - int ccMultiplicity = 0; - double ccScalarPt = 0.; - std::vector ccMomentum; - std::vector ccMaxPt; - - StatusCode ccSc = - ChargedCone( seed, parts, maxPts, coneSize, ccMultiplicity, ccScalarPt, ccMomentum, ccMaxPt ); - if ( ccSc.isFailure() ) ccMultiplicity = -1; - - ccP.SetX( ccMomentum[0] ); - ccP.SetY( ccMomentum[1] ); - ccP.SetZ( ccMomentum[2] ); - - double ccDeltaEta = seed->momentum().Eta() - ccP.Eta(); - double ccDeltaPhi = fabs( seed->momentum().Phi() - ccP.Phi() ); - if ( ccDeltaPhi > M_PI ) ccDeltaPhi = 2 * M_PI - ccDeltaPhi; - - // -- Fill the tuple with the variables - test &= tuple->column( prefix + "_" + conesize + "_cc_mult", ccMultiplicity ); - test &= tuple->column( prefix + "_" + conesize + "_cc_sPT", ccScalarPt ); - test &= tuple->column( prefix + "_" + conesize + "_cc_vPT", sqrt( ccP.Perp2() ) ); - - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_PX", ccP.X() ); - test &= tuple->column( prefix + "_" + conesize + "_cc_PY", ccP.Y() ); - test &= tuple->column( prefix + "_" + conesize + "_cc_PZ", ccP.Z() ); - } - - if ( m_fillAsymmetry ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_P", - ( seed->p() - sqrt( ccP.Mag2() ) ) / ( seed->p() + sqrt( ccP.Mag2() ) ) ); - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PT", - ( seed->pt() - sqrt( ccP.Perp2() ) ) / ( seed->pt() + sqrt( ccP.Perp2() ) ) ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PX", - ( seed->momentum().Px() - ccP.X() ) / ( seed->momentum().Px() + ccP.X() ) ); - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PY", - ( seed->momentum().Py() - ccP.Y() ) / ( seed->momentum().Py() + ccP.Y() ) ); - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PZ", - ( seed->momentum().Pz() - ccP.Z() ) / ( seed->momentum().Pz() + ccP.Z() ) ); - } - } - - if ( m_fillDeltas ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_deltaEta", ccDeltaEta ); - test &= tuple->column( prefix + "_" + conesize + "_cc_deltaPhi", ccDeltaPhi ); - } - - if ( m_fillIsolation ) - test &= tuple->column( prefix + "_" + conesize + "_cc_IT", - seed->pt() / sqrt( pow( seed->momentum().Px() + ccP.X(), 2 ) + - pow( seed->momentum().Py() + ccP.Y(), 2 ) ) ); - - if ( m_fillMaxPt ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_Q", (int)ccMaxPt[4] ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PT", - sqrt( pow( ccMaxPt[0], 2 ) + pow( ccMaxPt[1], 2 ) ) ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PX", ccMaxPt[0] ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PY", ccMaxPt[1] ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PZ", ccMaxPt[2] ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PE", ccMaxPt[3] ); - } - } - } else { - test &= tuple->column( prefix + "_" + conesize + "_cc_mult", 0 ); - test &= tuple->column( prefix + "_" + conesize + "_cc_sPT", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_vPT", 0. ); - - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_PX", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_PY", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_PZ", 0. ); - } - - if ( m_fillAsymmetry ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_P", 1. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PT", 1. ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PX", 1. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PY", 1. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_asy_PZ", 1. ); - } - } - - if ( m_fillDeltas ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_deltaEta", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_deltaPhi", 0. ); - } - - if ( m_fillIsolation ) test &= tuple->column( prefix + "_" + conesize + "_cc_IT", 1. ); - - if ( m_fillMaxPt ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_Q", 0 ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PT", 0. ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PX", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PY", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PZ", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_cc_maxPt_PE", 0. ); - } - } - } - } - - // -- Neutral cone - Gaudi::XYZVector ncP; - if ( m_fillNeutral ) { - if ( photons->size() != 0 ) { - int ncMultiplicity = 0; - double ncScalarPt = 0.; - std::vector ncMomentum; - std::vector ncMaxPt; - double LegH1, LegH2, LegH3, LegH4; - double avConfLevel, maxConfLevel; - StatusCode ncSc = NeutralCone( seed, photons, coneSize, ncMultiplicity, ncScalarPt, ncMomentum, ncMaxPt, - avConfLevel, maxConfLevel, LegH1, LegH2, LegH3, LegH4 ); - if ( ncSc.isFailure() ) ncMultiplicity = -1; - - ncP.SetX( ncMomentum[0] ); - ncP.SetY( ncMomentum[1] ); - ncP.SetZ( ncMomentum[2] ); - - double ncDeltaEta = seed->momentum().Eta() - ncP.Eta(); - double ncDeltaPhi = fabs( seed->momentum().Phi() - ncP.Phi() ); - if ( ncDeltaPhi > M_PI ) ncDeltaPhi = 2 * M_PI - ncDeltaPhi; - - // -- Fill the tuple with the variables - test &= tuple->column( prefix + "_" + conesize + "_nc_mult", ncMultiplicity ); - test &= tuple->column( prefix + "_" + conesize + "_nc_sPT", ncScalarPt ); - test &= tuple->column( prefix + "_" + conesize + "_nc_vPT", sqrt( ncP.Perp2() ) ); - - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_PX", ncP.X() ); - test &= tuple->column( prefix + "_" + conesize + "_nc_PY", ncP.Y() ); - test &= tuple->column( prefix + "_" + conesize + "_nc_PZ", ncP.Z() ); - test &= tuple->column( prefix + "_" + conesize + "_nc_avCL", avConfLevel ); - test &= tuple->column( prefix + "_" + conesize + "_nc_maxCL", maxConfLevel ); - } - - if ( m_fillAsymmetry ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_P", - ( seed->p() - sqrt( ncP.Mag2() ) ) / ( seed->p() + sqrt( ncP.Mag2() ) ) ); - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PT", - ( seed->pt() - sqrt( ncP.Perp2() ) ) / ( seed->pt() + sqrt( ncP.Perp2() ) ) ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PX", - ( seed->momentum().Px() - ncP.X() ) / ( seed->momentum().Px() + ncP.X() ) ); - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PY", - ( seed->momentum().Py() - ncP.Y() ) / ( seed->momentum().Py() + ncP.Y() ) ); - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PZ", - ( seed->momentum().Pz() - ncP.Z() ) / ( seed->momentum().Pz() + ncP.Z() ) ); - } - } - - if ( m_fillDeltas ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_deltaEta", ncDeltaEta ); - test &= tuple->column( prefix + "_" + conesize + "_nc_deltaPhi", ncDeltaPhi ); - } - - if ( m_fillIsolation ) - test &= tuple->column( prefix + "_" + conesize + "_nc_IT", - seed->pt() / sqrt( pow( seed->momentum().Px() + ncP.X(), 2 ) + - pow( seed->momentum().Py() + ncP.Y(), 2 ) ) ); - - if ( m_fillMaxPt ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PT", - sqrt( pow( ncMaxPt[0], 2 ) + pow( ncMaxPt[1], 2 ) ) ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PX", ncMaxPt[0] ); - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PY", ncMaxPt[1] ); - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PZ", ncMaxPt[2] ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H1", LegH1 ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H2", LegH2 ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H3", LegH3 ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H4", LegH4 ); - // test &= tuple->column(prefix + "_" + conesize + "_nc_Mass",TheMass); - } - } - } else { - test &= tuple->column( prefix + "_" + conesize + "_nc_mult", 0 ); - test &= tuple->column( prefix + "_" + conesize + "_nc_sPT", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_vPT", 0. ); - - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_PX", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_PY", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_PZ", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_avCL", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_maxCL", 0. ); - } - - if ( m_fillAsymmetry ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_P", 1. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PT", 1. ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PX", 1. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PY", 1. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_asy_PZ", 1. ); - } - } - - if ( m_fillDeltas ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_deltaEta", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_deltaPhi", 0. ); - } - - if ( m_fillIsolation ) test &= tuple->column( prefix + "_" + conesize + "_nc_IT", 1. ); - - if ( m_fillMaxPt ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PT", 0. ); - if ( m_fillComponents ) { - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PX", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PY", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_maxPt_PZ", 0. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H1", -1. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H2", -1. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H3", -1. ); - test &= tuple->column( prefix + "_" + conesize + "_nc_H4", -1. ); - // test &= tuple->column(prefix + "_" + conesize + "_nc_Mass",-1.); - } - } - } - } - - if ( m_fillIsolation ) { - if ( m_fillCharged && m_fillNeutral ) { - if ( ( parts->size() != 0 ) && ( photons->size() != 0 ) ) - test &= - tuple->column( prefix + "_" + conesize + "_IT", - seed->momentum().Pt() / sqrt( pow( seed->momentum().Px() + ccP.X() + ncP.X(), 2 ) + - pow( seed->momentum().Py() + ccP.Y() + ncP.Y(), 2 ) ) ); - else - test &= tuple->column( prefix + "_" + conesize + "_IT", 1. ); - } - } - - // -- Increase the counter with the stepsize - coneSize += m_sizeStep; - } - - if ( m_fillPi0Info ) { - if ( pizeros->size() != 0 ) { - int Pi0Multiplicity = 0; - std::vector MassWithPi0, Pi0MomX, Pi0MomY, Pi0MomZ, Pi0MomE, Pi0MomM, Pi0DeltaR, Pi0Ph1CL, Pi0Ph2CL; - test &= pi0Comb( seed, pizeros, Pi0Multiplicity, MassWithPi0, Pi0MomX, Pi0MomY, Pi0MomZ, Pi0MomE, Pi0MomM, - Pi0DeltaR, Pi0Ph1CL, Pi0Ph2CL ); - // -- Fill the tuple with the variables - test &= tuple->column( prefix + "_pi0_mult", Pi0Multiplicity ); - test &= tuple->farray( prefix + "_MasshPi0", MassWithPi0.begin(), MassWithPi0.end(), - prefix + "_Pi0_ArrayLength", MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0_PX", Pi0MomX.begin(), Pi0MomX.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0_PY", Pi0MomY.begin(), Pi0MomY.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0_PZ", Pi0MomZ.begin(), Pi0MomZ.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0_E", Pi0MomE.begin(), Pi0MomE.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0_M", Pi0MomM.begin(), Pi0MomM.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0_DeltaR", Pi0DeltaR.begin(), Pi0DeltaR.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0Ph1_CL", Pi0Ph1CL.begin(), Pi0Ph1CL.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_Pi0Ph2_CL", Pi0Ph2CL.begin(), Pi0Ph2CL.end(), prefix + "_Pi0_ArrayLength", - MAXNPIZEROS ); - } else { - std::vector MassWithPi0 = {-1}; - std::vector Pi0MomX = {-1e6}; - std::vector Pi0MomY = {-1e6}; - std::vector Pi0MomZ = {-1e6}; - std::vector Pi0MomE = {-1e6}; - std::vector Pi0MomM = {-1e6}; - std::vector Pi0DeltaR = {-1e6}; - std::vector Pi0Ph1CL = {-1e6}; - std::vector Pi0Ph2CL = {-1e6}; - - test &= tuple->column( prefix + "_pi0_mult", 0 ); - test &= tuple->farray( prefix + "_MasshPi0", MassWithPi0.begin(), MassWithPi0.end(), - prefix + "_Pi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_Pi0_PX", Pi0MomX.begin(), Pi0MomX.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_Pi0_PY", Pi0MomY.begin(), Pi0MomY.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_Pi0_PZ", Pi0MomZ.begin(), Pi0MomZ.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_Pi0_E", Pi0MomE.begin(), Pi0MomE.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_Pi0_M", Pi0MomM.begin(), Pi0MomM.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_Pi0_DeltaR", Pi0MomE.begin(), Pi0MomE.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_Pi0Ph1_CL", Pi0Ph1CL.begin(), Pi0Ph1CL.end(), prefix + "_Pi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_Pi0Ph2_CL", Pi0Ph2CL.begin(), Pi0Ph2CL.end(), prefix + "_Pi0_ArrayLength", 0 ); - } - } - - if ( m_fillMergedPi0Info ) { - if ( mergedpizeros->size() != 0 ) { - // warning() << "Non-empty merged pi0 list" << endmsg; - int MergPi0Multiplicity = 0; - - std::vector MassWithMergPi0, Pi0MomX, Pi0MomY, Pi0MomZ, Pi0MomE, Pi0MomM, Pi0DeltaR, Pi0Ph1CL, Pi0Ph2CL; - test &= pi0Comb( seed, mergedpizeros, MergPi0Multiplicity, MassWithMergPi0, Pi0MomX, Pi0MomY, Pi0MomZ, Pi0MomE, - Pi0MomM, Pi0DeltaR, Pi0Ph1CL, Pi0Ph2CL ); - // -- Fill the tuple with the variables - test &= tuple->column( prefix + "_mergpi0_mult", MergPi0Multiplicity ); - test &= tuple->farray( prefix + "_MasshMergPi0", MassWithMergPi0.begin(), MassWithMergPi0.end(), - prefix + "_MergPi0_ArrayLength", MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0_PX", Pi0MomX.begin(), Pi0MomX.end(), prefix + "_MergPi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0_PY", Pi0MomY.begin(), Pi0MomY.end(), prefix + "_MergPi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0_PZ", Pi0MomZ.begin(), Pi0MomZ.end(), prefix + "_MergPi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0_E", Pi0MomE.begin(), Pi0MomE.end(), prefix + "_MergPi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0_M", Pi0MomM.begin(), Pi0MomM.end(), prefix + "_MergPi0_ArrayLength", - MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0_DeltaR", Pi0DeltaR.begin(), Pi0DeltaR.end(), - prefix + "_MergPi0_ArrayLength", MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0Ph1_CL", Pi0Ph1CL.begin(), Pi0Ph1CL.end(), - prefix + "_MergPi0_ArrayLength", MAXNPIZEROS ); - test &= tuple->farray( prefix + "_MergPi0Ph2_CL", Pi0Ph2CL.begin(), Pi0Ph2CL.end(), - prefix + "_MergPi0_ArrayLength", MAXNPIZEROS ); - } else { - std::vector MassWithMergPi0 = {-1}; - std::vector Pi0MomX = {-1e6}; - std::vector Pi0MomY = {-1e6}; - std::vector Pi0MomZ = {-1e6}; - std::vector Pi0MomE = {-1e6}; - std::vector Pi0MomM = {-1e6}; - std::vector Pi0DeltaR = {-1e6}; - std::vector Pi0Ph1CL = {-1e6}; - std::vector Pi0Ph2CL = {-1e6}; - - test &= tuple->column( prefix + "_mergpi0_mult", 0 ); - test &= tuple->farray( prefix + "_MasshMergPi0", MassWithMergPi0.begin(), MassWithMergPi0.end(), - prefix + "_MergPi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_MergPi0_PX", Pi0MomX.begin(), Pi0MomX.end(), prefix + "_MergPi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_MergPi0_PY", Pi0MomY.begin(), Pi0MomY.end(), prefix + "_MergPi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_MergPi0_PZ", Pi0MomZ.begin(), Pi0MomZ.end(), prefix + "_MergPi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_MergPi0_E", Pi0MomE.begin(), Pi0MomE.end(), prefix + "_MergPi0_ArrayLength", 0 ); - test &= - tuple->farray( prefix + "_MergPi0_M", Pi0MomM.begin(), Pi0MomM.end(), prefix + "_MergPi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_MergPi0_DeltaR", Pi0MomE.begin(), Pi0MomE.end(), - prefix + "_MergPi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_MergPi0Ph1_CL", Pi0Ph1CL.begin(), Pi0Ph1CL.end(), - prefix + "_MergPi0_ArrayLength", 0 ); - test &= tuple->farray( prefix + "_MergPi0Ph2_CL", Pi0Ph2CL.begin(), Pi0Ph2CL.end(), - prefix + "_MergPi0_ArrayLength", 0 ); - } - } - - } else { - if ( msgLevel( MSG::WARNING ) ) warning() << "The seed particle is not valid. Skipping" << endmsg; - - return StatusCode::FAILURE; - } - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Stop looping through different conesizes" << endmsg; - - return StatusCode( test ); -} -//============================================================================= -// Save the particles in the decay chain (recursive function) -//============================================================================= -void TupleToolConeIsolation::saveDecayParticles( const LHCb::Particle* top ) { - - // -- Get the daughters of the top particle - const SmartRefVector daughters = top->daughters(); - - // -- Fill all the daugthers in m_decayParticles - for ( SmartRefVector::const_iterator ip = daughters.begin(); ip != daughters.end(); ++ip ) { - - // -- If the particle is stable, save it in the vector, or... - if ( ( *ip )->isBasicParticle() ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Filling particle with ID " << ( *ip )->particleID().pid() << endmsg; - m_decayParticles.push_back( ( *ip ) ); - } else { - // -- if it is not stable, call the function recursively - m_decayParticles.push_back( ( *ip ) ); - if ( msgLevel( MSG::DEBUG ) ) debug() << "Filling particle with ID " << ( *ip )->particleID().pid() << endmsg; - saveDecayParticles( ( *ip ) ); - } - } - - return; -} -//============================================================================= -// Loop over all the tracks in the cone which do not belong to the desired decay -//============================================================================= -StatusCode TupleToolConeIsolation::ChargedCone( const LHCb::Particle* seed, const LHCb::Particles* parts, - const LHCb::Particles* maxPts, const double rcut, int& multiplicity, - double& scalarPt, std::vector& momentum, - std::vector& maxPt ) { - - // -- Initialize values - multiplicity = 0; - scalarPt = 0; - double conePx = 0; - double conePy = 0; - double conePz = 0; - double maxPtPx = 0; - double maxPtPy = 0; - double maxPtPz = 0; - double maxPtPe = 0; - double maxPtQ = 0; - - // -- Get the momentum of the seed particle - Gaudi::XYZVector seedMomentum = seed->momentum().Vect(); - - for ( LHCb::Particles::const_iterator ip = parts->begin(); ip != parts->end(); ++ip ) { - const LHCb::Particle* particle = ( *ip ); - - const LHCb::ProtoParticle* proto = particle->proto(); - if ( proto ) { - - const LHCb::Track* track = proto->track(); - if ( track ) { - - // -- Check if the track belongs to the decay itself - bool isInDecay = isTrackInDecay( track ); - if ( isInDecay ) continue; - - Gaudi::XYZVector trackMomentum = track->momentum(); - - // -- Calculate the difference in Eta and Phi between the seed particle and a track - double deltaPhi = fabs( seedMomentum.Phi() - trackMomentum.Phi() ); - if ( deltaPhi > M_PI ) deltaPhi = 2 * M_PI - deltaPhi; - double deltaEta = seedMomentum.Eta() - trackMomentum.Eta(); - double deltaR = sqrt( pow( deltaPhi, 2 ) + pow( deltaEta, 2 ) ); - - if ( ( rcut == 0 ) || ( deltaR < rcut ) ) { - if ( track->type() == m_trackType ) { - - multiplicity++; - - // -- Calculate scalar information - scalarPt += track->pt(); - - // -- Calculate vector information - conePx += trackMomentum.X(); - conePy += trackMomentum.Y(); - conePz += trackMomentum.Z(); - - // -- Find max-pT particle - if ( maxPts->size() != 0 ) { - if ( track->pt() > sqrt( pow( maxPtPx, 2 ) + pow( maxPtPy, 2 ) ) ) { - - for ( LHCb::Particles::const_iterator iPt = maxPts->begin(); iPt != maxPts->end(); ++iPt ) { - const LHCb::Particle* particlePt = ( *iPt ); - - const LHCb::ProtoParticle* protoPt = particlePt->proto(); - if ( protoPt ) { - - if ( protoPt == proto ) { - - const LHCb::Track* trackPt = protoPt->track(); - if ( trackPt ) { - maxPtPx = trackPt->momentum().X(); - maxPtPy = trackPt->momentum().Y(); - maxPtPz = trackPt->momentum().Z(); - maxPtPe = particlePt->momentum().E(); - maxPtQ = trackPt->charge(); - } - - break; - } - } - } - } - } else { - maxPtPx = 0.; - maxPtPy = 0.; - maxPtPz = 0.; - maxPtPe = 0.; - maxPtQ = 0; - } - } - } - } - } - } - - momentum.push_back( conePx ); - momentum.push_back( conePy ); - momentum.push_back( conePz ); - - maxPt.push_back( maxPtPx ); - maxPt.push_back( maxPtPy ); - maxPt.push_back( maxPtPz ); - maxPt.push_back( maxPtPe ); - maxPt.push_back( maxPtQ ); - - return StatusCode::SUCCESS; -} -//============================================================================= -// Loop over all the photons in the cone -//============================================================================= -StatusCode TupleToolConeIsolation::NeutralCone( const LHCb::Particle* seed, const LHCb::Particles* photons, - const double rcut, int& multiplicity, double& scalarPt, - std::vector& momentum, std::vector& maxPt, - double& AvConfLevel, double& MaxConfLevel, double& LegendreRat1, - double& LegendreRat2, double& LegendreRat3, double& LegendreRat4 ) { - - // -- Initialize values - multiplicity = 0; - scalarPt = 0; - double conePx = 0; - double conePy = 0; - double conePz = 0; - double maxPtPx = 0; - double maxPtPy = 0; - double maxPtPz = 0; - double numLeg1 = 0; - double numLeg2 = 0; - double numLeg3 = 0; - double numLeg4 = 0; - double coneE = 0; - double maxP = 0; - double maxCL = 0; - double avCL = 0; - - // -- Get the momentum of the seed particle - Gaudi::XYZVector seedMomentum = seed->momentum().Vect(); - - for ( LHCb::Particles::const_iterator ip = photons->begin(); ip != photons->end(); ++ip ) { - const LHCb::Particle* photon = ( *ip ); - - double photCL = photon->confLevel(); - - // -- Get the momentum of the photon - Gaudi::XYZVector photonMomentum = photon->momentum().Vect(); - // -- Calculate the difference in Eta and Phi between the seed particle and a photons - double deltaPhi = fabs( seedMomentum.Phi() - photonMomentum.Phi() ); - if ( deltaPhi > M_PI ) deltaPhi = 2 * M_PI - deltaPhi; - double deltaEta = seedMomentum.Eta() - photonMomentum.Eta(); - double deltaR = sqrt( pow( deltaPhi, 2 ) + pow( deltaEta, 2 ) ); - - if ( ( rcut == 0 ) || ( deltaR < rcut ) ) { - multiplicity++; - - // -- Calculate scalar information - scalarPt += sqrt( photonMomentum.Perp2() ); - - // -- Calculate vector information - conePx += photonMomentum.X(); - conePy += photonMomentum.Y(); - conePz += photonMomentum.Z(); - - // Calculate sum for Legendre ratio - Double_t cosAng = ( seedMomentum.unit() ).Dot( photonMomentum.unit() ); - if ( cosAng > +1.0 ) { - cosAng = +1.0; - ++m_cosTooBigCounter; - } - if ( cosAng < -1.0 ) { - cosAng = -1.0; - ++m_cosTooLowCounter; - } - - coneE += std::sqrt( photonMomentum.Mag2() ); - numLeg1 += std::sqrt( photonMomentum.Mag2() ) * gsl_sf_legendre_Pl( 1, cosAng ); - numLeg2 += std::sqrt( photonMomentum.Mag2() ) * gsl_sf_legendre_Pl( 2, cosAng ); - numLeg3 += std::sqrt( photonMomentum.Mag2() ) * gsl_sf_legendre_Pl( 3, cosAng ); - numLeg4 += std::sqrt( photonMomentum.Mag2() ) * gsl_sf_legendre_Pl( 4, cosAng ); - // Extra Photon - if ( sqrt( photonMomentum.Perp2() ) > sqrt( pow( maxPtPx, 2 ) + pow( maxPtPy, 2 ) ) ) { - maxPtPx = photonMomentum.X(); - maxPtPy = photonMomentum.Y(); - maxPtPz = photonMomentum.Z(); - } - - // average CL and search for max CL - avCL += photCL; - if ( maxCL < photCL ) maxCL = photCL; - } - if ( std::sqrt( photonMomentum.Mag2() ) > maxP ) { maxP = std::sqrt( photonMomentum.Mag2() ); } - } - - momentum.push_back( conePx ); - momentum.push_back( conePy ); - momentum.push_back( conePz ); - - maxPt.push_back( maxPtPx ); - maxPt.push_back( maxPtPy ); - maxPt.push_back( maxPtPz ); - - AvConfLevel = avCL / multiplicity; - MaxConfLevel = maxCL; - - LegendreRat1 = numLeg1 / coneE; - LegendreRat2 = numLeg2 / coneE; - LegendreRat3 = numLeg3 / coneE; - LegendreRat4 = numLeg4 / coneE; - return StatusCode::SUCCESS; -} -//============================================================================= -// Check if the track is already in the decay -//============================================================================= -bool TupleToolConeIsolation::isTrackInDecay( const LHCb::Track* track ) { - - bool isInDecay = false; - - for ( std::vector::iterator ip = m_decayParticles.begin(); ip != m_decayParticles.end(); - ++ip ) { - const LHCb::ProtoParticle* proto = ( *ip )->proto(); - if ( proto ) { - - const LHCb::Track* myTrack = proto->track(); - if ( myTrack ) { - - if ( myTrack == track ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Track is in decay, skipping it" << endmsg; - isInDecay = true; - } - } - } - } - - return isInDecay; -} - -//============================================================================= -// Loop over all the pi0 in the cone -//============================================================================= -StatusCode TupleToolConeIsolation::pi0Comb( const LHCb::Particle* seed, const LHCb::Particles* pi0s, int& multiplicity, - std::vector& InvMass, std::vector& Pi0PX, - std::vector& Pi0PY, std::vector& Pi0PZ, - std::vector& Pi0E, std::vector& Pi0M, - std::vector& Pi0DeltaR, std::vector& Pi0Photon1CL, - std::vector& Pi0Photon2CL ) { - - // -- Initialize values - - // -- Get the momentum of the seed particle - Gaudi::XYZVector seedMomentum = seed->momentum().Vect(); - Gaudi::LorentzVector seed4Momentum = seed->momentum(); - - for ( LHCb::Particles::const_iterator ip = pi0s->begin(); ip != pi0s->end(); ++ip ) { - const LHCb::Particle* pion0 = ( *ip ); - - // -- Get the momentum of the pion0 - Gaudi::XYZVector pion0Momentum = pion0->momentum().Vect(); - Gaudi::LorentzVector pion04Momentum = pion0->momentum(); - double masshPi0 = ( pion04Momentum + seed4Momentum ).M(); - if ( masshPi0 < m_MaxhPi0Mass && masshPi0 > m_MinhPi0Mass ) { - multiplicity++; - InvMass.push_back( masshPi0 ); - Pi0PX.push_back( pion0Momentum.X() ); - Pi0PY.push_back( pion0Momentum.Y() ); - Pi0PZ.push_back( pion0Momentum.Z() ); - Pi0E.push_back( pion04Momentum.E() ); - Pi0M.push_back( pion04Momentum.M() ); - - // -- Calculate the difference in Eta and Phi between the seed particle and the pi0 - double deltaPhi = fabs( seedMomentum.Phi() - pion0Momentum.Phi() ); - if ( deltaPhi > M_PI ) deltaPhi = 2 * M_PI - deltaPhi; - double deltaEta = seedMomentum.Eta() - pion0Momentum.Eta(); - double deltaR = sqrt( pow( deltaPhi, 2 ) + pow( deltaEta, 2 ) ); - Pi0DeltaR.push_back( deltaR ); - - // Get photon info: - if ( !( pion0->isBasicParticle() ) ) { - - const SmartRefVector photons = pion0->daughters(); - - // -- Fill all the daugthers in m_decayParticles - Int_t nph = 0; - - for ( SmartRefVector::const_iterator iph = photons.begin(); iph != photons.end(); ++iph ) { - double photonCL = ( *iph )->confLevel(); - if ( nph == 0 ) Pi0Photon1CL.push_back( photonCL ); - if ( nph == 1 ) Pi0Photon2CL.push_back( photonCL ); - nph++; - } - - } else { - Pi0Photon1CL.push_back( -999 ); - Pi0Photon2CL.push_back( -999 ); - } - } - } - - return StatusCode::SUCCESS; -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolDEDX.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolDEDX.cpp deleted file mode 100644 index 8d0322b2..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolDEDX.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include - -#include "TrackInterfaces/IMeasurementProvider.h" - -#include "Kernel/IParticleTupleTool.h" -#include "Kernel/Track2MC.h" - -#include "Linker/LinkedFrom.h" -#include "Linker/LinkedTo.h" -#include "Linker/LinkerTool.h" -#include "Linker/LinkerWithKey.h" - -#include "Event/MCHit.h" -#include "Event/Particle.h" -#include "Event/Track.h" -#include "Event/VeloCluster.h" - -#include "GaudiAlg/GaudiTool.h" -#include "GaudiAlg/GaudiTupleAlg.h" -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -#include "map" - -/** - * \brief Skeleton for DaVinci Tutorial 7 - * - * \sa DecayTreeTuple - * - * @author Rob Lambert - * @date 2009-06-09 - */ -class TupleToolDEDX : public GaudiTool, virtual public IParticleTupleTool { -public: - // Start VeloPID: - LHCb::Tracks* tracks; - LHCb::VeloClusters* m_clusters; - LHCb::MCParticles* m_MCParticles; - LHCb::MCHits* m_MCHits; - LHCb::ProtoParticles* protoParticles; - unsigned long m_event; - // // std::string asctName(); - // //From Tomasz: - // typedef LinkerTool AsctTool; - // typedef AsctTool::DirectType Table; - // typedef Table::Range Range; - // typedef Table::iterator iterator; - std::string m_asctLocation; - // IMCParticleSelector* m_mcSelector; /// MC selector - // virtual StatusCode loopOnTracks(); - // StatusCode plotCluster(LHCb::VeloCluster* cluster,std::string ClusterType, double theta=-400.,double prap = - //-400.); - void quickSort( double arr[], int left, int right ); - StatusCode plotSensorsADC( double& adc, std::string corr, std::string& ClusterType, int sensor_num = -400 ); - bool m_MC; - bool m_AngleCorrection; - std::string m_clusterCont; - std::string m_trackCont; - std::string m_MCCont; - std::string m_track2MC; - std::string m_MCHitsCont; - std::string m_protoParticlesCont; - // End VELOPID - - TupleToolDEDX( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - bool m_abs; -}; - -#define MAXCLUSTERS 45 - -// Declaration of the Tool Factory -// actually acts as a using namespace TupleTool -DECLARE_COMPONENT( TupleToolDEDX ) - -namespace { - using std::pow; - using std::sqrt; -} // namespace - //============================================================================= - // Standard constructor, initializes variables - //============================================================================= -TupleToolDEDX::TupleToolDEDX( const std::string& type, const std::string& name, const IInterface* parent ) - : GaudiTool( type, name, parent ) { - declareInterface( this ); - declareProperty( "absCharge", m_abs = false ); -} - -//============================================================================= - -StatusCode TupleToolDEDX::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& ) { - // fill some information about the particle here! - bool test = true; - if ( P ) { - // fill some information here! - // std::cout<<"INSIDE TUPLETOOL HERE!!!!!!" << std::endl; - if ( m_abs ) - test &= tuple->column( head + "_Q", std::abs( P->charge() ) ).isSuccess(); - else - test &= tuple->column( head + "_Q", P->charge() ).isSuccess(); - test &= tuple->column( head + "_eta", P->momentum().Rapidity() ).isSuccess(); - - if ( !exist( LHCb::VeloClusterLocation::Default ) ) { - debug() << "No VeloClusters container found for this event !" << endmsg; - return StatusCode::FAILURE; - } else { - m_clusters = get( LHCb::VeloClusterLocation::Default ); - debug() << " -> number of clusters found in TES: " << m_clusters->size() << endmsg; - } - - // NEW CODE: - // Loop on tracks starts here: - // int nTracks=tracks->size(); - // int nProtoParticles = protoParticles->size(); - int TrackCounter = 0; - int ClusterCounter = 0; - // int PID=0; - std::string dirName; - - const LHCb::ProtoParticle* proto = P->proto(); - if ( !proto ) return StatusCode::SUCCESS; - const LHCb::Track* track = proto->track(); - if ( !track ) return StatusCode::SUCCESS; - // Skip the tracks without VELO(Velo, VeloR, Upstream and Long)hits - if ( !track->hasVelo() ) { - debug() << "Track has no VELO hits, continuing with next track." << endmsg; - // continue; - } - - // Get track IDs: - const std::vector& trackID = track->lhcbIDs(); - // int nClusters=trackID.size(); - - // Get track angle vector: - Gaudi::XYZVector slope = track->slopes(); - Gaudi::XYZVector momentum = track->momentum(); - debug() << "Starting linker" << endmsg; - - int trackType = track->type(); - double theta = slope.Theta(); - // double phi = slope.Phi(); - // double trackp = sqrt(momentum.Mag2() )/Gaudi::Units::GeV; - double trackpt = momentum.rho(); - double trackpx = momentum.x(); - double trackpy = momentum.y(); - double trackpz = momentum.z(); - double prap = track->pseudoRapidity(); - double trackChi2 = track->chi2(); - int trackKey = track->key(); - int trackVeloKey = -10; - const SmartRefVector& ancestors = track->ancestors(); - for ( SmartRefVector::const_iterator it4 = ancestors.begin(); it4 != ancestors.end(); ++it4 ) { - if ( ( *it4 )->type() == 1 ) trackVeloKey = ( *it4 )->key(); - // else trackVeloKey = -1; - } - - double trackProbChi2 = track->probChi2(); - double trackLikelihood = track->likelihood(); - double trackGhostProb = track->ghostProbability(); - double trackChi2PerDoF = track->chi2PerDoF(); - int tracknDoF = track->nDoF(); - - // Muon PID: - double protoMuLL( -999 ); - double protoMuBkgLL( -999 ); - if ( proto->hasInfo( 200 ) ) { - const LHCb::MuonPID* protoMuPID = proto->muonPID(); - protoMuLL = protoMuPID->MuonLLMu(); - debug() << "Muon LL: " << protoMuLL << endmsg; - protoMuBkgLL = protoMuPID->MuonLLBg(); - } - - // Rich PID: - float protoRichDLLe( -999 ); - float protoRichDLLmu( -999 ); - float protoRichDLLpi( -999 ); - float protoRichDLLk( -999 ); - float protoRichDLLp( -999 ); - int protoRichBestPID( -1 ); - if ( proto->hasInfo( 100 ) ) protoRichDLLe = proto->richPID()->particleDeltaLL( ( Rich::Electron ) ); - if ( proto->hasInfo( 101 ) ) protoRichDLLmu = proto->richPID()->particleDeltaLL( ( Rich::Muon ) ); - if ( proto->hasInfo( 102 ) ) protoRichDLLpi = proto->richPID()->particleDeltaLL( ( Rich::Pion ) ); - if ( proto->hasInfo( 103 ) ) protoRichDLLk = proto->richPID()->particleDeltaLL( ( Rich::Kaon ) ); - if ( proto->hasInfo( 104 ) ) protoRichDLLp = proto->richPID()->particleDeltaLL( ( Rich::Proton ) ); - - if ( proto->richPID() ) { protoRichBestPID = proto->richPID()->bestParticleID(); } - - // Try to find Calo PID: - const SmartRefVector& caloVec = proto->calo(); - std::vector protoCaloHypothesis; - std::vector protoCaloLh; - SmartRefVector::const_iterator iCalo; - for ( iCalo = caloVec.begin(); iCalo != caloVec.end(); iCalo++ ) { - const LHCb::CaloHypo* protoCaloData = iCalo->target(); - if ( protoCaloData ) { - protoCaloHypothesis.push_back( protoCaloData->hypothesis() ); - protoCaloLh.push_back( protoCaloData->lh() ); - } - } - // tracks travel at an angle relative to sensors, so have a factor to account for - // the excess material traversed. This will need to be refined later... - // dE/dx = constant \times ADC counts/ path. path = 300 um /cos(theta); - // dE/dx = constant' \times cos(theta) - double AngleFactor = 1; - // if(m_AngleCorrection){ - if ( cos( theta ) != 0 ) AngleFactor = cos( theta ); - //} - std::vector::const_iterator iID; - std::vector ADCValues; - std::vector CorrectedADCValues; - std::list listOfADCValues; - debug() << "==> Begin loop over track IDs: " << trackID.size() << " clusters" << endmsg; - ClusterCounter = 0; - debug() << "Track number " << TrackCounter << endmsg; - double ClusterArray[MAXCLUSTERS] = {0.0}; // store up to MAXCLUSTERS of info... - double CorrectedClusterArray[MAXCLUSTERS] = {0.0}; // store up to MAXCLUSTERS of info... - for ( iID = trackID.begin(); iID != trackID.end(); ++iID ) { - if ( ( *iID ).isVelo() ) { - const LHCb::VeloChannelID vcID = ( *iID ).veloID(); - // Veloclusters: - m_clusters = get( LHCb::VeloClusterLocation::Default ); - debug() << " -> number of clusters found in TES: " << m_clusters->size() << endmsg; - - debug() << "Getting cluster " << endmsg; - LHCb::VeloCluster* cluster = m_clusters->object( vcID ); - if ( !cluster ) return StatusCode::SUCCESS; - - debug() << "After cluster " << TrackCounter << endmsg; - - if ( 0 == cluster ) { - error() << "Missing cluster with ID " << vcID << endmsg; - continue; - } - LHCb::VeloChannelID idfilter = cluster->channelID(); - - // Separate info for R and Phi sensors... - if ( idfilter.isRType() ) { - // Can do something here... - } else if ( idfilter.isPhiType() ) { - // do something with the phis. - } - double adc = cluster->totalCharge(); - if ( ClusterCounter < MAXCLUSTERS ) { - ClusterArray[ClusterCounter] = adc; - ADCValues.push_back( adc ); - } - adc = cluster->totalCharge() * AngleFactor; - if ( ClusterCounter < MAXCLUSTERS ) { - CorrectedClusterArray[ClusterCounter] = adc; - CorrectedADCValues.push_back( adc ); - // listOfADCValues.push_back(adc); - } else { - error() << "More clusters than MAXCLUSTERS..." << endmsg; - continue; - } - - // Make some plots of the first 2 tracks of the first 3 events to check - // everything is okay... - // if(TrackCounter<2 && m_event<3){ - // boost::format fmtEvt ( "Landau/Event%03d/Track%03d" ) ; - // fmtEvt % m_event % TrackCounter ; - // dirName = fmtEvt.str() ; - // plot1D(adc,dirName, "Landau", 0, 200, 100); - // } - ClusterCounter++; - } - } - quickSort( ClusterArray, 0, ClusterCounter - 1 ); - quickSort( CorrectedClusterArray, 0, ClusterCounter - 1 ); - - float MPV_Median = 0; - float MPV_Corrected_Median = 0; - float MPV_Trunc20 = 0; - float MPV_Trunc40 = 0; - float MPV_GenMean_0_5 = 0; - float MPV_GenMean_2 = 0; - float MPV_GenMean_4 = 0; - float MPV_GenMean_6 = 0; - float MPV_Mean = 0; - int nToInclude20 = 0; - int nToInclude40 = 0; - double tempMean = 0.0; - if ( ClusterCounter >= 2 ) { - // Median: - debug() << "==> Calculating Median " << endmsg; - if ( ClusterCounter % 2 != 0 ) { - MPV_Corrected_Median = (float)CorrectedClusterArray[ClusterCounter / 2]; - MPV_Median = (float)ClusterArray[ClusterCounter / 2]; - } else { - MPV_Corrected_Median = 0.5 * ( (float)CorrectedClusterArray[ClusterCounter / 2] + - (float)CorrectedClusterArray[( ClusterCounter / 2 ) - 1] ); - MPV_Median = - 0.5 * ( (float)ClusterArray[ClusterCounter / 2] + (float)ClusterArray[( ClusterCounter / 2 ) - 1] ); - } - - debug() << "==> Calculating Mean " << endmsg; - tempMean = 0.0; - for ( int i = 0; i < ClusterCounter; i++ ) tempMean += ClusterArray[i]; - MPV_Mean = tempMean / ClusterCounter; - tempMean = 0.0; - // Trunc20: - debug() << "==> Calculating Truncated Mean " << endmsg; - if ( ClusterCounter < 5 ) - MPV_Trunc20 = MPV_Median; - else { - nToInclude20 = (int)round( 0.8 * ClusterCounter ); - tempMean = 0.0; - for ( int i = 0; i < nToInclude20; i++ ) tempMean += ClusterArray[i]; - MPV_Trunc20 = tempMean / nToInclude20; - } - // Trunc40: - if ( ClusterCounter < 5 ) - MPV_Trunc40 = MPV_Median; - else { - nToInclude40 = (int)round( 0.6 * ClusterCounter ); - tempMean = 0.0; - for ( int i = 0; i < nToInclude40; i++ ) tempMean += ClusterArray[i]; - MPV_Trunc40 = tempMean / nToInclude40; - } - - // Generalized mean, k=-2: - debug() << "==> Calculating Generalized Mean " << endmsg; - tempMean = 0.0; - - float PowerK = -2.; - for ( int i = 0; i < ClusterCounter; i++ ) { tempMean += pow( ClusterArray[i], PowerK ); } - MPV_GenMean_2 = pow( ( tempMean / ClusterCounter ), 1. / PowerK ); - - // Generalized mean, k=-0.5: - tempMean = 0.0; - PowerK = -0.5; - for ( int i = 0; i < ClusterCounter; i++ ) { tempMean += pow( ClusterArray[i], PowerK ); } - MPV_GenMean_0_5 = pow( ( tempMean / ClusterCounter ), 1. / PowerK ); - - // Generalized mean, k=-4: - tempMean = 0.0; - PowerK = -4.; - for ( int i = 0; i < ClusterCounter; i++ ) { tempMean += pow( ClusterArray[i], PowerK ); } - MPV_GenMean_4 = pow( ( tempMean / ClusterCounter ), 1. / PowerK ); - - // Generalized mean, k=-6: - tempMean = 0.0; - PowerK = -6.; - for ( int i = 0; i < ClusterCounter; i++ ) { tempMean += pow( ClusterArray[i], PowerK ); } - MPV_GenMean_6 = pow( ( tempMean / ClusterCounter ), 1. / PowerK ); - } - // Fill ntuple: - // tuple->column("EventNumber", m_event); - // tuple->column("TrackNumber",TrackCounter ); - // tuple->column("phi", phi); - // tuple->column("TrackID", PID); - tuple->column( head + "_DEDX_theta", theta ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - // tuple->column("momentum", trackp); - // tuple->column("momentumTRUE", trackpTRUE/GeV); - tuple->column( head + "_DEDX_pt", trackpt ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_px", trackpx ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_py", trackpy ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_pz", trackpz ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_pseudoRapidity", prap ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackType", trackType ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackKey", trackKey ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackVeloKey", trackVeloKey ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackChi2", trackChi2 ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackProbChi2", trackProbChi2 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackLikelihood", trackLikelihood ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackGhostProb", trackGhostProb ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_trackChi2PerDoF", trackChi2PerDoF ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_tracknDoF", tracknDoF ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - // PID: - tuple->column( head + "_DEDX_protoMuBkgLL", protoMuBkgLL ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoMuLL", protoMuLL ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoRichDLLe", protoRichDLLe ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoRichDLLmu", protoRichDLLmu ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoRichDLLpi", protoRichDLLpi ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoRichDLLk", protoRichDLLk ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoRichDLLp", protoRichDLLp ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_protoRichBestPID", protoRichBestPID ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( head + "_DEDX_protoCaloHypothesis", protoCaloHypothesis.begin(), protoCaloHypothesis.end(), - "CaloHypoLength", 100 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( head + "_DEDX_protoCaloLh", protoCaloLh.begin(), protoCaloLh.end(), "CaloHypoLength", 100 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_Mean", MPV_Mean ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_Median", MPV_Median ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_Corrected_Median", MPV_Corrected_Median ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_Trunc20", MPV_Trunc20 ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_Trunc40", MPV_Trunc40 ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_GenMean_2", MPV_GenMean_2 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_GenMean_4", MPV_GenMean_4 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_GenMean_6", MPV_GenMean_6 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_MPV_GenMean_0_5", MPV_GenMean_0_5 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( head + "_DEDX_nClustersPerTrack", ClusterCounter ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( head + "_DEDX_ADCValues", ADCValues.begin(), ADCValues.end(), head + "_DEDX_ArrayLength", - MAXCLUSTERS ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( head + "_DEDX_CorrectedADCValues", CorrectedADCValues.begin(), CorrectedADCValues.end(), - head + "_DEDX_ArrayLength", MAXCLUSTERS ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - - } else { - return StatusCode::FAILURE; - } - return StatusCode( test ); -} - -//============================================================================ -// QuickSort, for finding median... -//============================================================================ -void TupleToolDEDX::quickSort( double arr[], int left, int right ) { - int i = left, j = right; - double tmp; - double pivot = arr[( left + right ) / 2]; - /* partition */ - while ( i <= j ) { - while ( arr[i] < pivot ) i++; - while ( arr[j] > pivot ) j--; - if ( i <= j ) { - tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; - i++; - j--; - } - }; - /* recursion */ - if ( left < j ) quickSort( arr, left, j ); - if ( i < right ) quickSort( arr, i, right ); -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolMCAssociatedClusters.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolMCAssociatedClusters.cpp deleted file mode 100644 index d3663c53..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolMCAssociatedClusters.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" - -#include "Kernel/IParticle2MCAssociator.h" -#include "Kernel/IParticleTupleTool.h" - -#include "Linker/LinkedFrom.h" -#include "Linker/LinkedFromKey.h" -#include "Linker/LinkedTo.h" - -#include "Event/FTCluster.h" -#include "Event/MCParticle.h" -#include "Event/Particle.h" -#include "Event/Track.h" -#include "Event/UTCluster.h" -#include "Event/VPCluster.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -/** - * The TupleToolMCAssociatedClusters stores information on the number of TT/IT/OT/Velo - * clusters which are associated with the MCParticle (which again is associated with the - * Particle currently looked at). - * - * The information that is stored: - * - How many clusters are there associated to this MCParticle - * - Out of the clusters used by the track reconstructed, how many are linked to this MCP - * - * Combining this with the LoKi track functors to count the total number of clusters - * used by the track, one then also can deduce the number of clusters used in the track - * which were not associated with the MCParticle. - * - * In order to use this, the linker tables must be there. For modern MC, - * this requires the DaVinci input file to be at least "LDST". - * - * A somewhat related Brunel-tool is the TrackCheckerNT, which runs over all tracks - * in the event. The goal of this tool is to get the information for a signal decay - * only. - * - * @author Laurent Dufour - */ -class TupleToolMCAssociatedClusters : public TupleToolBase, virtual public IParticleTupleTool { -public: - TupleToolMCAssociatedClusters( const std::string& type, const std::string& name, const IInterface* parent ); - - StatusCode initialize() override; - - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - std::vector m_p2mcAssocTypes; - std::vector m_p2mcAssocs; - - bool m_checkUniqueness; -}; - -TupleToolMCAssociatedClusters::TupleToolMCAssociatedClusters( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - // interface - declareInterface( this ); - - // MC associators to try, in order - m_p2mcAssocTypes.push_back( "DaVinciSmartAssociator" ); - m_p2mcAssocTypes.push_back( "MCMatchObjP2MCRelator" ); - declareProperty( "IP2MCPAssociatorTypes", m_p2mcAssocTypes ); - - declareProperty( "CheckUniqueness", m_checkUniqueness = true ); -} - -//============================================================================= -// Initialization. Check parameters -//============================================================================= -StatusCode TupleToolMCAssociatedClusters::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - // the MC associators - m_p2mcAssocs.clear(); - for ( std::vector::const_iterator iMCAss = m_p2mcAssocTypes.begin(); iMCAss != m_p2mcAssocTypes.end(); - ++iMCAss ) { - m_p2mcAssocs.push_back( tool( *iMCAss, this ) ); - } - if ( m_p2mcAssocs.empty() ) { return Error( "No MC associators configured" ); } - - return StatusCode::SUCCESS; -} - -StatusCode TupleToolMCAssociatedClusters::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& ) { - // retrieve the currently linked MCP, this will be our working base - const LHCb::MCParticle* mcp( NULL ); - const std::string prefix = fullName( head ); - - unsigned int nFoundFT = 0; - unsigned int nFoundUT = 0; - unsigned int nFoundVP = 0; - - unsigned int nFoundUniqueFT = 0; - unsigned int nFoundUniqueUT = 0; - unsigned int nFoundUniqueVP = 0; - - size_t nMCHitsFT = 0; - size_t nMCHitsUT = 0; - size_t nMCHitsVP = 0; - - if ( !P ) return StatusCode::FAILURE; - - // first just return if the particle isn't supposed to have a track - if ( !P->isBasicParticle() ) return StatusCode::SUCCESS; - - const auto& protop = P->proto(); - if ( !protop ) return StatusCode::SUCCESS; - - const auto& track = protop->track(); - if ( !track ) return StatusCode::SUCCESS; - - const auto& lhcbIDs = track->lhcbIDs(); - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Number of lhcbIDs: " << lhcbIDs.size() << endmsg; - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Getting related MCP to " << P << endmsg; - - for ( std::vector::const_iterator iMCAss = m_p2mcAssocs.begin(); - iMCAss != m_p2mcAssocs.end(); ++iMCAss ) { - mcp = ( *iMCAss )->relatedMCP( P ); - if ( mcp ) break; - } - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Got mcp " << mcp << endmsg; - - if ( mcp != NULL ) { - // get VPClusters and count correct and total number of clusters - // Get the linker table MCParticle => VPCluster - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Trying to retrieve linker tables." << endmsg; - - LinkedFromKey ftLink( evtSvc(), msgSvc(), LHCb::FTClusterLocation::Default ); - - LinkedTo utLink( evtSvc(), msgSvc(), LHCb::UTClusterLocation::UTClusters ); - LinkedFrom utLinkRev( evtSvc(), msgSvc(), LHCb::UTClusterLocation::UTClusters ); - - LinkedFrom vp2MCPLink( evtSvc(), msgSvc(), LHCb::VPClusterLocation::Default ); - LinkedTo MCP2VPLink( evtSvc(), msgSvc(), LHCb::VPClusterLocation::Default ); - - if ( ftLink.notFound() ) return Error( "Unable to retrieve MCParticle-Cluster linker table for FT" ); - - if ( utLink.notFound() ) return Error( "Unable to retrieve MCParticle-Cluster linker table for UT" ); - - if ( vp2MCPLink.notFound() ) return Error( "Unable to retrieve MCParticle-VPCluster linker table" ); - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Building cluster lists for this MCP." << endmsg; - - const auto& ftChannelIdList = ftLink.keyRange( mcp ); - const auto& utClusterList = utLinkRev.range( mcp ); - const auto& vpClusterList = vp2MCPLink.range( mcp ); - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Counting cluster lists." << endmsg; - nMCHitsFT = ftChannelIdList.size(); - nMCHitsUT = utClusterList.size(); - nMCHitsVP = vpClusterList.size(); - - /** - * Comparing here the number of LHCb IDs v.s. the number of MCParticle clusters. - */ - std::vector usedFTIDs; - std::vector usedUTIDs; - std::vector usedVPIDs; - - for ( const auto& lhcbID : lhcbIDs ) { - if ( lhcbID.isFT() ) { - const LHCb::FTChannelID& measuredFTChannelID = lhcbID.ftID(); - const auto& it = std::find_if( ftChannelIdList.begin(), ftChannelIdList.end(), - [&measuredFTChannelID]( const LHCb::FTChannelID& ftchannelid ) { - return ftchannelid == measuredFTChannelID; - } ); - - if ( it != ftChannelIdList.end() ) { - if ( m_checkUniqueness && - std::find( usedFTIDs.begin(), usedFTIDs.end(), measuredFTChannelID ) == usedFTIDs.end() ) { - usedFTIDs.push_back( measuredFTChannelID ); - nFoundUniqueFT++; - } - - nFoundFT++; - } - } - - if ( lhcbID.isUT() ) { - const auto& measuredUTChannelID = lhcbID.stID(); - const auto& it = std::find_if( utClusterList.begin(), utClusterList.end(), - [&measuredUTChannelID]( const LHCb::UTCluster* const& cluster ) { - return cluster->channelID() == measuredUTChannelID; - } ); - - if ( it != utClusterList.end() ) { - if ( m_checkUniqueness && - std::find( usedUTIDs.begin(), usedUTIDs.end(), measuredUTChannelID ) == usedUTIDs.end() ) { - usedUTIDs.push_back( measuredUTChannelID ); - nFoundUniqueUT++; - } - - nFoundUT++; - } - } - - if ( lhcbID.isVP() ) { - const auto& measuredVPChannelID = lhcbID.vpID(); - const auto& it = std::find_if( vpClusterList.begin(), vpClusterList.end(), - [&measuredVPChannelID]( const LHCb::VPCluster* const& cluster ) { - return cluster->channelID() == measuredVPChannelID; - } ); - - if ( it != vpClusterList.end() ) { - if ( m_checkUniqueness && - std::find( usedVPIDs.begin(), usedVPIDs.end(), measuredVPChannelID ) == usedVPIDs.end() ) { - usedVPIDs.push_back( measuredVPChannelID ); - nFoundUniqueVP++; - } - - nFoundVP++; - } - } - } - } - - tuple->column( prefix + "_MC_nUsedFTClusters", nFoundFT ).ignore(); - tuple->column( prefix + "_MC_nUsedUTClusters", nFoundUT ).ignore(); - tuple->column( prefix + "_MC_nUsedVPClusters", nFoundVP ).ignore(); - - if ( m_checkUniqueness ) { - tuple->column( prefix + "_MC_nUsedUniqueFTClusters", nFoundUniqueFT ).ignore(); - tuple->column( prefix + "_MC_nUsedUniqueUTClusters", nFoundUniqueUT ).ignore(); - tuple->column( prefix + "_MC_nUsedUniqueVPClusters", nFoundUniqueVP ).ignore(); - } - - tuple->column( prefix + "_MC_nFTClusters", nMCHitsFT ).ignore(); - tuple->column( prefix + "_MC_nUTClusters", nMCHitsUT ).ignore(); - tuple->column( prefix + "_MC_nVPClusters", nMCHitsVP ).ignore(); - - return StatusCode::SUCCESS; -} - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolMCAssociatedClusters ) diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolTrackIsolation.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolTrackIsolation.cpp deleted file mode 100644 index 65aa87bb..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolTrackIsolation.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" - -#include "Event/Particle.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/PhysicalConstants.h" - -/** @class TupleToolTrackIsolation TupleToolTrackIsolation.h - * - * \brief Fill track isolation for DecayTreeTuple. - * Open up a cone around head, exclude all tracks - * that are in the decay descriptor - * (i.e. that belong to the decay you are looking for), - * build the variables with the remaining tracks. - * - * - head_cmult : Number of tracks inside cone. - * - head_cp : Summed p inside cone - * - head_cpt : Summed pt inside cone - * - head_cpx : Summed px inside cone - * - head_cpy : Summed py inside cone - * - head_cpz : Summed pz inside cone - * - * If Verbose, or other flags are set: - * - * Asymmetry variables - * - head_pasy : (head_P - head_cp)/(head_P + head_cp) - * - head_ptasy : (head_PT - head_cpt)/(head_PT + head_cpt) - * - head_pxasy : (head_Px - head_cpx)/(head_Px + head_cpx) - * - head_pyasy : (head_Py - head_cpy)/(head_Py + head_cpy) - * - head_pzasy : (head_Pz - head_cpz)/(head_Pz + head_cpz) - * Delta angle variables - * - head_DeltaEta : Difference in eta between summed tracks and head - * - head_DeltaPhi : Difference in phi between summed tracks and head - * - * - * Options: - * - * - MinConeAngle: Set the minimal deltaR of the cone (default = 0.5), in radians - * - MaxConeAngle: Set the maximum deltaR of the cone (default = 1.0), in radians - * - StepSize: Set the step of deltaR between two iterations (default = 0.1), in radians - * - TrackType: Set the type of tracks which are considered inside the cone (default = 3) - * - FillAsymmetry: Flag to fill the asymmetry variables (default = false) - * - FillDeltaAngles: Flag to fill the delta angle variables (default = false) - * \sa DecayTreeTuple - * - * @author Michel De Cian - * @date 2009-08-04 - */ -class TupleToolTrackIsolation : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolTrackIsolation( const std::string& type, const std::string& name, const IInterface* parent ); - /// Loop over differnt conesizes and fill the variables into the tuple - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - StatusCode initialize() override; ///< Algorithm initialization - -private: - double m_minConeAngle; - double m_maxConeAngle; - double m_stepSize; - int m_trackType; - bool m_fillAsymmetry; - bool m_fillDeltaAngles; - - std::vector m_decayParticles; - - /// Save all particles in your decay descriptor in a vector - void saveDecayParticles( const LHCb::Particle* top ); - - /// Calculate properties of your remaining tracks inside the cone - std::pair, int> ConeP( const LHCb::Particle* part, const LHCb::Tracks* tracks, - const double rcut ); - - /// Check if your track belongs to your decay or not - bool isTrackInDecay( const LHCb::Track* track ); -}; - -// Declaration of the Algorithm Factory -DECLARE_COMPONENT( TupleToolTrackIsolation ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolTrackIsolation::TupleToolTrackIsolation( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); - declareProperty( "MinConeAngle", m_minConeAngle = 0.5, - "Set the minimal deltaR of the cone (default = 0.5), in radians" ); - declareProperty( "MaxConeAngle", m_maxConeAngle = 1.0, - "Set the maximum deltaR of the cone (default = 1.0), in radians" ); - declareProperty( "StepSize", m_stepSize = 0.1, - "Set the step of deltaR between two iterations (default = 0.1), in radians" ); - declareProperty( "TrackType", m_trackType = 3, - "Set the type of tracks which are considered inside the cone (default = 3)" ); - declareProperty( "FillAsymmetry", m_fillAsymmetry = false, "Flag to fill the asymmetry variables (default = false)" ); - declareProperty( "FillDeltaAngles", m_fillDeltaAngles = false, - "Flag to fill the delta angle variables (default = false)" ); -} - -//============================================================================= -// Initialization -//============================================================================= -StatusCode TupleToolTrackIsolation::initialize() { - StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - if ( m_minConeAngle > m_maxConeAngle ) { return Error( "Max conesize smaller than min conesize." ); } - - if ( isVerbose() ) { m_fillAsymmetry = m_fillDeltaAngles = true; } - - return sc; -} - -//============================================================================= -// Fill the tuple -//============================================================================= -StatusCode TupleToolTrackIsolation::fill( const LHCb::Particle* top, const LHCb::Particle* part, - const std::string& head, Tuples::Tuple& tuple, IGeometryInfo const& ) { - bool test = true; - - if ( part ) { - - const std::string prefix = fullName( head ); - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Fill" << endmsg; - - // -- The vector m_decayParticles contains all the particles that belong to the given decay - // -- according to the decay descriptor. - - // -- Clear the vector with the particles in the specific decay - m_decayParticles.clear(); - - // -- Add the mother (prefix of the decay chain) to the vector - if ( msgLevel( MSG::DEBUG ) ) debug() << "Filling particle with ID " << top->particleID().pid() << endmsg; - m_decayParticles.push_back( top ); - - // -- Save all particles that belong to the given decay in the vector m_decayParticles - saveDecayParticles( top ); - - // -- Get all tracks in the event - LHCb::Tracks* tracks = get( LHCb::TrackLocation::Default ); - if ( tracks->empty() ) { return Warning( "Could not retrieve tracks. Skipping" ); } - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Start looping through different conesizes" << endmsg; - - // -- Loop over the different conesizes - double coneSizeCounter = m_minConeAngle; - while ( coneSizeCounter <= m_maxConeAngle ) { - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Filling variables with conesize " << coneSizeCounter << endmsg; - - // -- Retrieve momentum information of tracks in the cone - std::pair, int> myPair = ConeP( part, tracks, coneSizeCounter ); - const std::vector& myVector = myPair.first; - - const double conePx = myVector[0]; - const double conePy = myVector[1]; - const double conePz = myVector[2]; - - const double conePx2 = conePx * conePx; - const double conePy2 = conePy * conePy; - - const double coneP = std::sqrt( conePx2 + conePy2 + conePz * conePz ); - const double conePt = std::sqrt( conePx2 + conePy2 ); - - // -- Create a vector with the summed momentum of all tracks in the cone - Gaudi::XYZVector momentumInCone; - momentumInCone.SetX( conePx ); - momentumInCone.SetY( conePy ); - momentumInCone.SetZ( conePz ); - - // -- Calculate the difference in Eta and Phi between the summed momentum of all tracks in the cone and the - // -- track of the particle in question - const double deltaEta = part->momentum().Eta() - momentumInCone.Eta(); - double deltaPhi = fabs( part->momentum().Phi() - momentumInCone.Phi() ); - if ( deltaPhi > M_PI ) deltaPhi = 2 * M_PI - deltaPhi; - - // -- Convert the conesize to a string (and don't forget the space for the terminating '\0'!) - char coneNumber[5]; - sprintf( coneNumber, "%.2f", coneSizeCounter ); - std::string conesize( coneNumber ); - - // -- Fill the tuple with the variables - test &= tuple->column( prefix + "_cpx_" + conesize, conePx ); - test &= tuple->column( prefix + "_cpy_" + conesize, conePy ); - test &= tuple->column( prefix + "_cpz_" + conesize, conePz ); - test &= tuple->column( prefix + "_cpt_" + conesize, conePt ); - test &= tuple->column( prefix + "_cp_" + conesize, coneP ); - test &= tuple->column( prefix + "_cmult_" + conesize, myPair.second ); - - // -- Fill the difference in Eta and Phi between the summed momentum of all tracks in the cone and the - // -- track of the particle in question if requested - if ( m_fillDeltaAngles ) { - test &= tuple->column( prefix + "_deltaEta_" + conesize, deltaEta ); - test &= tuple->column( prefix + "_deltaPhi_" + conesize, deltaPhi ); - } - - // -- Fill the asymmetry information if requested - if ( m_fillAsymmetry ) { - test &= tuple->column( prefix + "_pxasy_" + conesize, - ( part->momentum().Px() - conePx ) / ( part->momentum().Px() + conePx ) ); - test &= tuple->column( prefix + "_pyasy_" + conesize, - ( part->momentum().Py() - conePy ) / ( part->momentum().Py() + conePy ) ); - test &= tuple->column( prefix + "_pzasy_" + conesize, - ( part->momentum().Pz() - conePz ) / ( part->momentum().Pz() + conePz ) ); - test &= tuple->column( prefix + "_pasy_" + conesize, ( part->p() - coneP ) / ( part->p() + coneP ) ); - test &= tuple->column( prefix + "_ptasy_" + conesize, ( part->pt() - conePt ) / ( part->pt() + conePt ) ); - } - - // -- Increase the counter with the stepsize - coneSizeCounter += m_stepSize; - } - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Stop looping through different conesizes" << endmsg; - - } else { - return Warning( "The particle in question is not valid" ); - } - - return StatusCode( test ); -} - -//============================================================================= -// Save the particles in the decay chain (recursive function) -//============================================================================= -void TupleToolTrackIsolation::saveDecayParticles( const LHCb::Particle* top ) { - - // -- Get the daughters of the top particle - const SmartRefVector& daughters = top->daughters(); - - // -- Fill all the daugthers in m_decayParticles - for ( SmartRefVector::const_iterator idau = daughters.begin(); idau != daughters.end(); ++idau ) { - - // -- If the particle is stable, save it in the vector, or... - if ( ( *idau )->isBasicParticle() ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Filling particle with ID " << ( *idau )->particleID().pid() << endmsg; - m_decayParticles.push_back( ( *idau ) ); - } else { - // -- if it is not stable, call the function recursively - m_decayParticles.push_back( ( *idau ) ); - if ( msgLevel( MSG::DEBUG ) ) debug() << "Filling particle with ID " << ( *idau )->particleID().pid() << endmsg; - saveDecayParticles( ( *idau ) ); - } - } -} - -//============================================================================= -// Loop over all the tracks in the cone which do not belong to the desired decay -//============================================================================= -std::pair, int> TupleToolTrackIsolation::ConeP( const LHCb::Particle* part, - const LHCb::Tracks* tracks, const double rcut ) { - - // -- Get the (4-) momentum of the particle in question - const Gaudi::LorentzVector& partMomentum = part->momentum(); - double sumPx = 0.0; - double sumPy = 0.0; - double sumPz = 0.0; - int counter = 0; - - for ( LHCb::Tracks::const_iterator it = tracks->begin(); it != tracks->end(); ++it ) { - LHCb::Track* track = ( *it ); - - // -- Check if the track belongs to the decay itself - bool isInDecay = isTrackInDecay( track ); - if ( isInDecay ) continue; - - // -- Get the (3-) momentum of the track - const Gaudi::XYZVector& trackMomentum = track->momentum(); - // double tracketa = track->pseudoRapidity(); - const double trackpx = trackMomentum.X(); - const double trackpy = trackMomentum.Y(); - const double trackpz = trackMomentum.Z(); - - // -- Calculate the difference in Eta and Phi between the particle in question and a track - double deltaPhi = fabs( partMomentum.Phi() - trackMomentum.Phi() ); - if ( deltaPhi > M_PI ) deltaPhi = 2 * M_PI - deltaPhi; - - const double deltaEta = partMomentum.Eta() - trackMomentum.Eta(); - - const double deltaR = std::sqrt( deltaPhi * deltaPhi + deltaEta * deltaEta ); - - // -- Add the tracks to the summation if deltaR is smaller than the cut value of deltaR - if ( deltaR < rcut && track->type() == m_trackType ) { - sumPx += trackpx; - sumPy += trackpy; - sumPz += trackpz; - ++counter; - } - } - - // -- Fill a vector and return it - std::vector myVector; - myVector.push_back( sumPx ); - myVector.push_back( sumPy ); - myVector.push_back( sumPz ); - - std::pair, int> myPair; - myPair.first = myVector; - myPair.second = counter; - - return myPair; -} - -//============================================================================= -// Check if the track is already in the decay -//============================================================================= -bool TupleToolTrackIsolation::isTrackInDecay( const LHCb::Track* track ) { - - bool isInDecay = false; - - for ( std::vector::iterator it = m_decayParticles.begin(); it != m_decayParticles.end(); - ++it ) { - - const LHCb::ProtoParticle* proto = ( *it )->proto(); - if ( proto ) { - const LHCb::Track* myTrack = proto->track(); - - if ( myTrack ) { - - if ( myTrack == track ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Track is in decay, skipping it" << endmsg; - isInDecay = true; - } - } - } - } - - return isInDecay; -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolTrackKink.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolTrackKink.cpp deleted file mode 100644 index f4f0626a..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolTrackKink.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2020 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" -#include "TrackInterfaces/ITrackFitter.h" -#include "TrackKernel/TrackFunctors.h" -#include "TrackKernel/TrackTraj.h" - -#include "Event/ChiSquare.h" -#include "Event/FitNode.h" -#include "Event/KalmanFitResult.h" -#include "Event/Track.h" -#include "Event/TrackFitResult.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/ToolHandle.h" - -#include - -#include - -/** - * \brief TupleTool to reconstruct and save information about kinks on given tracks - * - * Two methods are provided: - * - KinkChi2 - * - KinkFitChi2 - * The following variables are stored: - * - _TRACK_kinkChi2, _TRACK_kinkChi2z - * - _TRACK_kinkFitChi2, _TRACK_kinkFitDeltaR, _TRACK_kinkFitDeltaRE, _TRACK_kinkFitDeltaRZ - * - * @author Francesco Dettori - * @date 2013-23-02 - */ -class TupleToolTrackKink : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolTrackKink( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - StatusCode kinkChi2( const LHCb::Track& track, double& chi2kink, double& zkink ) const; - - StatusCode fitKink( const LHCb::Track& track, double& kink_deltaR, double& kink_deltaR_err, double& kink_chi2, - double& kink_z ); - - typedef ROOT::Math::SMatrix Matrix3x3; - typedef ROOT::Math::SMatrix Matrix5x3; - typedef ROOT::Math::SMatrix Matrix3x5; - typedef ROOT::Math::SMatrix Matrix5x5; - - ToolHandle m_trackfitter; -}; - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolTrackKink ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolTrackKink::TupleToolTrackKink( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_trackfitter( "TrackMasterFitter", this ) { - declareInterface( this ); - declareProperty( "TrackFitter", m_trackfitter ); -} - -StatusCode TupleToolTrackKink::initialize() { - StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - sc = m_trackfitter.retrieve(); - - return sc; -} - -StatusCode TupleToolTrackKink::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - const std::string prefix = fullName( head ); - bool test = true; - - if ( !P ) return StatusCode::FAILURE; - - // first just return if the particle isn't supposed to have a track - if ( !P->isBasicParticle() ) return StatusCode::SUCCESS; - - const LHCb::ProtoParticle* protop = P->proto(); - if ( !protop ) return StatusCode::SUCCESS; - - const LHCb::Track* track = protop->track(); - if ( !track ) return StatusCode::SUCCESS; - - if ( msgLevel( MSG::DEBUG ) ) - debug() << prefix << " " << track->type() << " " + prefix + "_TRACK_CHI2 " << track->chi2() << endmsg; - if ( msgLevel( MSG::VERBOSE ) ) verbose() << *track << endmsg; - - if ( msgLevel( MSG::DEBUG ) ) debug() << "Going to refit track " << endmsg; - - double kinkchi2( -999. ), zkink( -999. ); - StatusCode sc = m_trackfitter->operator()( const_cast( *track ), geometry ); - if ( sc.isSuccess() ) { - sc = kinkChi2( *track, kinkchi2, zkink ); - } else { - Warning( "Unable to refit track: kinkChi2 will have default value -999" ).ignore(); - } - - // First method - test &= tuple->column( prefix + "_TRACK_kinkChi2", kinkchi2 ); - test &= tuple->column( prefix + "_TRACK_kinkChi2z", zkink ); - - // second method - double kink_deltaR( -999 ), kink_deltaR_err( -999 ), kink_deltaR_z( -999 ), kink_chi2( -999 ); - sc = fitKink( *track, kink_deltaR, kink_deltaR_err, kink_chi2, kink_deltaR_z ); - - test &= tuple->column( prefix + "_TRACK_kinkFitChi2", kink_chi2 ); - test &= tuple->column( prefix + "_TRACK_kinkFitDeltaR", kink_deltaR ); - test &= tuple->column( prefix + "_TRACK_kinkFitDeltaRE", kink_deltaR_err ); - test &= tuple->column( prefix + "_TRACK_kinkFitDeltaRZ", kink_deltaR_z ); - - return StatusCode::SUCCESS; -} - -StatusCode TupleToolTrackKink::kinkChi2( const LHCb::Track& track, double& chi2kink, double& zkink ) const { - chi2kink = 0; - zkink = 0; - - // Loop on nodes and get the ones with measurement - const auto& nodes_ = nodes( track ); - std::vector measnodes{}; - measnodes.reserve( nodes_.size() ); - - for ( auto const n : nodes_ ) { - if ( n && n->hasMeasurement() ) { measnodes.push_back( static_cast( n ) ); } - } - - if ( measnodes.empty() ) { return Warning( "No measurement nodes found" ); } - - // Get chi2 in the forward direction up to each node - std::vector chi2forward{}; - chi2forward.reserve( measnodes.size() ); - std::transform( begin( measnodes ), end( measnodes ), std::back_inserter( chi2forward ), - []( auto n ) { return n->deltaChi2Forward().chi2(); } ); - std::partial_sum( begin( chi2forward ), end( chi2forward ), begin( chi2forward ) ); - - std::vector chi2backward{}; - chi2backward.reserve( measnodes.size() ); - std::transform( begin( measnodes ), end( measnodes ), std::back_inserter( chi2backward ), - []( auto n ) { return n->deltaChi2Backward().chi2(); } ); - std::partial_sum( rbegin( chi2backward ), rend( chi2backward ), rbegin( chi2backward ) ); - - const double chi2tot = std::max( chi2forward.back(), chi2backward.front() ); - - // find the kink as the pont with largest chi2 variation - const int minkinkstep = 4; - const size_t ndof = 5; - int ikink = 0; - const int N = measnodes.size(); - - for ( int i = minkinkstep - 1; i < N - minkinkstep + 1; ++i ) { - const double thischi2kink = ( chi2tot - chi2forward[i] - chi2backward[i + 1] ) / ndof; - // info() << " kinkchi2: thischi2kink " << thischi2kink << endmsg; - if ( thischi2kink > chi2kink ) { - ikink = i; - chi2kink = thischi2kink; - } - } - // Get z position of the kink - zkink = 0.5 * ( measnodes[ikink]->z() + measnodes[ikink + 1]->z() ); - - return StatusCode::SUCCESS; -} - -//============================================================================= -StatusCode TupleToolTrackKink::fitKink( const LHCb::Track& input_track, double& kink_deltaR, double& kink_deltaR_err, - double& kink_chi2, double& kink_z ) { - - // Scan in z or in nodes - const LHCb::TrackFitResult* fitresult = fitResult( input_track ); - bool upstream = ( fitresult->nodes().front()->z() > fitresult->nodes().back()->z() ); - - double max_chi2( -1 ); - if ( fitresult ) { - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "fitKink: got fit result " << endmsg; - - const LHCb::TrackFitResult::NodeContainer& nodes_ = fitresult->nodes(); - // const std::vector& measures = fitresult->measurements(); - - std::vector measnodes; - measnodes.reserve( nodes_.size() ); - // Get only measnodes - for ( const LHCb::FitNode* node : nodes_ ) { - if ( !node ) { return Warning( "Nodes not found, lets skip this entry" ); } - if ( node->hasMeasurement() ) { measnodes.push_back( static_cast( node ) ); } - } - - // Loop on measnodes and get states - for ( const LHCb::FitNode* node : measnodes ) { - const LHCb::State& stateUp = upstream ? node->filteredStateForward() : node->predictedStateForward(); - const LHCb::State& stateDown = upstream ? node->predictedStateBackward() : node->filteredStateBackward(); - - // Get vector of difference between the two states ant its covariance - Gaudi::TrackVector delta_zero = stateUp.stateVector() - stateDown.stateVector(); - Gaudi::TrackSymMatrix cov = stateUp.covariance() + stateDown.covariance(); - if ( delta_zero( 0 ) == 0 ) continue; - - // Set up matrix of constraints - Matrix3x5 Dconstr; - Dconstr( 0, 0 ) = Dconstr( 1, 1 ) = Dconstr( 2, 4 ) = 1; - Matrix5x3 DconstrT; - DconstrT( 0, 0 ) = DconstrT( 1, 1 ) = DconstrT( 4, 2 ) = 1; // Faster than Transpose - - // Matrix3x5 tmp_m = Dconstr * cov; - Matrix3x3 DVD = Dconstr * cov * DconstrT; - // 3x3 = 3x5 * 5x5 * 5x3 - Matrix3x3 DVDinv = DVD; - - if ( msgLevel( MSG::VERBOSE ) ) { - verbose() << "covariance " << std::endl << cov << endmsg; - verbose() << "DMATRIX" << std::endl << Dconstr << std::endl << DconstrT << endmsg; - verbose() << "DVD " << std::endl << DVD << endmsg; - } - - if ( !DVDinv.Invert() ) { return Warning( "No inverse matrix, no kink fit chi2" ); } - if ( msgLevel( MSG::DEBUG ) ) debug() << "DVD inverted " << std::endl << DVDinv << endmsg; - - Matrix5x5 H = cov * DconstrT * DVDinv * Dconstr; - // 5x5 = 5x5 * 5x3 * 3x3 * 3*5 - - Gaudi::Vector3 lambda = DVDinv * Dconstr * delta_zero; - // 3 = 3x3 * 3x5 * 5 - - Gaudi::TrackVector delta = delta_zero - H * delta_zero; - // 5 = 5 - 5x5 * 5 - - Gaudi::Vector3 lambda_mod = DVD * lambda; - // 3 = 3x3 *3 - - if ( msgLevel( MSG::DEBUG ) ) { - debug() << " delta was " << delta_zero << " now it is " << delta << endmsg; - debug() << " lambda is " << lambda << endmsg; - } - - // // Then we get the chi2 - double chi2 = ROOT::Math::Dot( lambda, lambda_mod ); - if ( msgLevel( MSG::DEBUG ) ) debug() << " Chi2 is " << chi2 << endmsg; - - Matrix5x5 cov_2 = cov - H * cov; - // 5x5 = 5x5 - 5x5 * 5x5 - - // DeltaR = sqrt [( dy/dz - (dy/dz)' )^2 + ( dx/dz - (dx/dz)' )^2 ] - double deltaR = std::sqrt( delta( 2 ) * delta( 2 ) + delta( 3 ) * delta( 3 ) ); - double deltaR_err = - std::sqrt( std::pow( delta( 2 ), 2 ) * cov_2( 2, 2 ) + std::pow( delta( 3 ), 2 ) * cov_2( 3, 3 ) + - delta( 2 ) * delta( 3 ) * cov_2( 2, 3 ) ) / - deltaR; - - // Get largest chi2 variation and its correspondent parameters - if ( chi2 > max_chi2 ) { - max_chi2 = chi2; - kink_deltaR = deltaR; - kink_deltaR_err = deltaR_err; - kink_z = ( upstream ? stateUp.z() : stateDown.z() ); - } - - if ( msgLevel( MSG::DEBUG ) ) - debug() << "DeltaR is " << deltaR << " +- " << deltaR_err << " chi2 is " << chi2 << " max_chi2 " << max_chi2 - << endmsg; - } - } else { - return Warning( "Fit result not found, skipping kinkFit calculation" ); - } - kink_chi2 = max_chi2; - - return StatusCode::SUCCESS; -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolTrackPosition.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolTrackPosition.cpp deleted file mode 100644 index 1280699a..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolTrackPosition.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "TrackInterfaces/ITrackExtrapolator.h" -#include "TrackInterfaces/ITrackStateProvider.h" - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" - -#include "Event/Particle.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -/** - * \brief Plot the X/Y position at a given Z - * - * Steer with: - * - Z : the Z-position at which to plot the X/Y, double, defaults to 2500 (TT-stations) - * - Extrapolator : which track extrapolator to use, defaults to the TrackStateProvider - * - ExtraName : the universal TupleTool option, in case you want to use multiples of this tool - * - * fills: - * - head_X - * - head_Y - * - * \sa DecayTreeTuple - * - * 2009-05-06 : Michel De Cian - * - * @author Rob Lambert - * @date 2011-01-20 - */ -class TupleToolTrackPosition : public TupleToolBase, virtual public IParticleTupleTool { -public: - TupleToolTrackPosition( const std::string& type, const std::string& name, const IInterface* parent ); - /// Loop over differnt conesizes and fill the variables into the tuple - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - StatusCode initialize() override; - -private: - double m_Z; ///< Where to propagate the track - const ITrackStateProvider* m_extrapolator; ///< pointer tot the track extrapolator - std::string m_extrapolatorName; ///< which extrapolator to use -}; - -// Declaration of the Algorithm Factory -DECLARE_COMPONENT( TupleToolTrackPosition ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolTrackPosition::TupleToolTrackPosition( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_Z( 2500. ), m_extrapolator( NULL ), m_extrapolatorName( "" ) { - declareInterface( this ); - declareProperty( "Z", m_Z = 2500., - "Which Z-position to propagate the track to, defaults to 2500, the position of the TT-stations" ); - declareProperty( "Extrapolator", m_extrapolatorName = "TrackStateProvider", "Which extrapolator to use" ); -} - -//============================================================================= -// Initialization -//============================================================================= -StatusCode TupleToolTrackPosition::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - m_extrapolator = tool( m_extrapolatorName, this ); - - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Initialize" << endmsg; - - return sc; -} - -//============================================================================= -// Fill the tuple -//============================================================================= -StatusCode TupleToolTrackPosition::fill( const LHCb::Particle*, const LHCb::Particle* part, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - - const std::string prefix = fullName( head ); - if ( msgLevel( MSG::DEBUG ) ) debug() << "==> Fill" << endmsg; - - bool test = true; - - double X = -999999; - double Y = -999999; - - if ( part && part->proto() && part->proto()->track() ) { - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "extrapolating track to Z=" << m_Z << endmsg; - - LHCb::State aState = LHCb::State(); - // const LHCb::Track aTrack= *(part->proto()->track()); - StatusCode sc = m_extrapolator->stateFromTrajectory( aState, *( part->proto()->track() ), m_Z, geometry ); - if ( sc.isSuccess() ) { - X = aState.x(); - Y = aState.y(); - } - } - - test &= tuple->column( prefix + "_X", X ); - test &= tuple->column( prefix + "_Y", Y ); - - return StatusCode( test ); -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolTrackTime.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolTrackTime.cpp deleted file mode 100644 index 159477eb..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolTrackTime.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" -#include "TrackInterfaces/ITrackFitter.h" - -#include "Event/ChiSquare.h" -#include "Event/FitNode.h" -#include "Event/KalmanFitResult.h" -#include "Event/Measurement.h" -#include "Event/Track.h" -#include "Event/TrackFitResult.h" - -#include "TrackKernel/TrackFunctors.h" -#include "TrackKernel/TrackTraj.h" - -#include "LHCbMath/ValueWithError.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/ToolHandle.h" - -#include - -/** - * \brief TupleTool to calculate timing information on the track - * - * @author Francesco Dettori, based on code from W. Hulsbergen - * @date 2016-26-02 - */ -class TupleToolTrackTime : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolTrackTime( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - Gaudi::Math::ValueWithError computeTrackT0( const LHCb::Track& track ); - - ToolHandle m_trackfitter; -}; - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolTrackTime ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolTrackTime::TupleToolTrackTime( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_trackfitter( "TrackMasterFitter", this ) { - declareInterface( this ); - declareProperty( "TrackFitter", m_trackfitter ); -} - -StatusCode TupleToolTrackTime::initialize() { - StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - sc = m_trackfitter.retrieve(); - - return sc; -} - -StatusCode TupleToolTrackTime::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - if ( msgLevel( MSG::VERBOSE ) ) verbose() << " filling particle " << endmsg; - const std::string prefix = fullName( head ); - bool test = true; - - if ( !P ) return StatusCode::FAILURE; - - // first just return if the particle isn't supposed to have a track - if ( !P->isBasicParticle() ) return StatusCode::SUCCESS; - - const LHCb::ProtoParticle* protop = P->proto(); - if ( !protop ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Protoparticle not found for this particle" << endmsg; - return StatusCode::SUCCESS; - } - - const LHCb::Track* track = protop->track(); - if ( !track ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Track not found for this particle" << endmsg; - return StatusCode::SUCCESS; - } - - if ( msgLevel( MSG::DEBUG ) ) - debug() << prefix << " " << track->type() << " " + prefix + "_TRACK_CHI2 " << track->chi2() << endmsg; - if ( msgLevel( MSG::VERBOSE ) ) verbose() << *track << endmsg; - - Gaudi::Math::ValueWithError track_t0( 0, 0 ); - try { - LHCb::Track* clone = new LHCb::Track( *track, track->key() ); - - StatusCode sc = m_trackfitter->operator()( *clone, geometry ); - if ( sc.isSuccess() ) { - track_t0 = computeTrackT0( *clone ); - if ( msgLevel( MSG::DEBUG ) ) debug() << " Obtained t0: " << track_t0 << endmsg; - } else { - Warning( "Unable to refit track: track time will have default value 0" ).ignore(); - } - delete clone; - - } catch ( const GaudiException& ) { Warning( "There was a problem accessing data for track refit" ).ignore(); } - - // First method - test &= tuple->column( prefix + "_TRACK_time", track_t0.value() ); - test &= tuple->column( prefix + "_TRACK_time_err", track_t0.error() ); - - return StatusCode::SUCCESS; -} - -Gaudi::Math::ValueWithError TupleToolTrackTime::computeTrackT0( const LHCb::Track& ) { - - // Check if fit result is available (this should always be the case) - Gaudi::Math::ValueWithError rc( 0, 0 ); - - return rc; -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.cpp deleted file mode 100644 index c6f889ff..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -// Include files - -// from Gaudi -#include "TupleToolVELOClusters.h" -#include "Event/ODIN.h" -#include "Event/Track.h" - -// local -#include "TupleToolVELOClusters.h" - -//----------------------------------------------------------------------------- - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolVELOClusters::TupleToolVELOClusters( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); -} - -StatusCode TupleToolVELOClusters::fill( Tuples::Tuple& tup ) { - const std::string prefix = fullName(); - - // Fill the tuple - bool test = true; - std::vector stations; - std::vector stationADC; - - std::vector vids; - vids.reserve( 1000 ); - LHCb::Tracks* tracksCont = get( LHCb::TrackLocation::Default ); - if ( !tracksCont || tracksCont->empty() ) { return StatusCode::FAILURE; } - for ( LHCb::Tracks::iterator iter = tracksCont->begin(); iter != tracksCont->end(); ++iter ) { - const std::vector& ids = ( *iter )->lhcbIDs(); - for ( std::vector::const_iterator it = ids.begin(); it != ids.end(); ++it ) { - if ( it->isVelo() ) vids.push_back( it->veloID() ); - } // lhcbids - } // tracks - - std::sort( vids.begin(), vids.end() ); - std::vector::iterator u = std::unique( vids.begin(), vids.end() ); - vids.resize( u - vids.begin() ); - - LHCb::VeloClusters* clusters = getIfExists( evtSvc(), m_locationClusters ); - if ( !clusters || clusters->empty() ) { - Warning( "No VeloClusters found at location " + m_locationClusters + " for this event " ).ignore(); - return StatusCode::SUCCESS; - } - // MDN loop over the clusters - for ( LHCb::VeloClusters::iterator iterV = clusters->begin(); iterV != clusters->end(); ++iterV ) { - // check if used on track - if ( std::find( vids.begin(), vids.end(), ( *iterV )->channelID() ) == vids.end() ) { - - if ( msgLevel( MSG::DEBUG ) ) - debug() << "hit is not on track " << ( *iterV )->isRType() << " " << ( *iterV )->isPhiType() << " " - << ( *iterV )->isPileUp() << endmsg; - - const double mysensor = (double)( *iterV )->channelID().sensor(); - stations.push_back( mysensor ); - const double adc = ( *iterV )->totalCharge(); - stationADC.push_back( adc ); - } - } - - const int unusedvelo = clusters->size() - vids.size(); - - // info() << " n unused = " << unusedvelo << endmsg; - test &= tup->column( prefix + "nUnusedVeloClusters", unusedvelo ); - test &= tup->farray( prefix + "UNUSED_VELO_STATION_ADC", stationADC.begin(), stationADC.end(), "nClusters", 100 ); - test &= tup->farray( prefix + "UNUSED_VELO_STATION_VECTOR", stations.begin(), stations.end(), "nClusters", 100 ); - - return StatusCode( test ); -} - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolVELOClusters ) diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.h b/Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.h deleted file mode 100644 index dd5b4e34..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolVELOClusters.h +++ /dev/null @@ -1,40 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#ifndef TUPLETOOLRECOSTATS_H -#define TUPLETOOLRECOSTATS_H 1 - -// Include files -// from Gaudi -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IEventTupleTool.h" // Interface - -#include "Event/Track.h" -#include "Event/VeloCluster.h" - -/** @class TupleToolVELOClusters TupleToolVELOClusters.h - * - * Fills VELO information - */ -class TupleToolVELOClusters : public TupleToolBase, virtual public IEventTupleTool { - -public: - /// Standard constructor - TupleToolVELOClusters( const std::string& type, const std::string& name, const IInterface* parent ); - - /// Declare properties - Gaudi::Property m_locationClusters{this, "VeloClusterLocation", LHCb::VeloClusterLocation::Default, - "Location of VELO clusters"}; - - StatusCode fill( Tuples::Tuple& ) override; ///< Fill tuple - // int unusedVelo(); -}; - -#endif // TUPLETOOLRECOSTATS_H diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackClusterInfo.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackClusterInfo.cpp deleted file mode 100755 index c45992b3..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackClusterInfo.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" -#include "TrackInterfaces/IMeasurementProvider.h" - -#include "Event/Particle.h" -#include "Event/Track.h" -#include "Event/VeloCluster.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -/** * - * _TRACK_VELO_TOTALCHARGE sum of the adc counts of the velo clusters - * _TRACK_VELO_AVERAGECHARGE average adc counts - * _TRACK_VELO_CLUSTERSONTRACK how many velo clusters on this track - * _TRACK_VELO_STATION_ADC adc counts indexed in a vector - * _TRACK_VELO_STATION_VECTOR vector with the sensor numbers of the clusters same index as the adc. - * - * @author Kazu Akiba - * @date 2012-12-12 - */ -struct TupleToolVeloTrackClusterInfo : TupleToolBase, virtual IParticleTupleTool { - - TupleToolVeloTrackClusterInfo( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - - /// Declare properties - Gaudi::Property m_locationClusters{this, "VeloClusterLocation", LHCb::VeloClusterLocation::Default, - "Location of VELO clusters"}; -}; - -// Declaration of the Tool Factory -// actually acts as a using namespace TupleTool -DECLARE_COMPONENT( TupleToolVeloTrackClusterInfo ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolVeloTrackClusterInfo::TupleToolVeloTrackClusterInfo( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); -} - -StatusCode TupleToolVeloTrackClusterInfo::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& ) { - const std::string prefix = fullName( head ); - - const size_t maxStationsInVeloTrack = 100; - bool test = true; - if ( !P ) return StatusCode::FAILURE; - - // first just return if the particle isn't supposed to have a track - if ( !P->isBasicParticle() ) return StatusCode::SUCCESS; - - const LHCb::ProtoParticle* protop = P->proto(); - if ( !protop ) return StatusCode::SUCCESS; - - const LHCb::Track* track = protop->track(); - if ( !track ) - return StatusCode::SUCCESS; - - else - test &= tuple->column( prefix + "_TRACK_TCHI2NDOF", -1. ); - std::vector stations; - std::vector stationADC; - double averageCharge = 0; - double totalChargeOnTrack = 0; - double nClustersOnTrack = 0; - const std::vector& ids = ( track )->lhcbIDs(); - for ( std::vector::const_iterator it = ids.begin(); it != ids.end(); ++it ) { - if ( it->isVelo() == true ) { - const LHCb::VeloChannelID vcID = ( it )->veloID(); - // Veloclusters: - LHCb::VeloClusters* m_clusters = get( m_locationClusters ); - debug() << " -> number of clusters found in TES: " << m_clusters->size() << endmsg; - debug() << "Getting cluster " << endmsg; - LHCb::VeloCluster* cluster = m_clusters->object( vcID ); - if ( !cluster ) return StatusCode::SUCCESS; - if ( 0 == cluster ) { - error() << "Missing cluster with ID " << vcID << endmsg; - continue; - } - int sensor = it->veloID().sensor(); - double mysensor = sensor; - stations.push_back( mysensor ); - double adc = cluster->totalCharge(); - stationADC.push_back( adc ); - averageCharge += adc; - nClustersOnTrack++; - } - } // lhcbids - - totalChargeOnTrack = averageCharge; - if ( nClustersOnTrack > 0 ) - averageCharge /= nClustersOnTrack; - else - averageCharge = -1000; - - int nVeloClustersOnTrack = (int)nClustersOnTrack; - test &= tuple->column( prefix + "_TRACK_VELO_TOTALCHARGE", totalChargeOnTrack ); - test &= tuple->column( prefix + "_TRACK_VELO_AVERAGECHARGE", averageCharge ); - test &= tuple->column( prefix + "_TRACK_VELO_CLUSTERSONTRACK", nVeloClustersOnTrack ); - // for (int ii = 0; ii farray( prefix + "_TRACK_VELO_STATION_ADC", stationADC.begin(), stationADC.end(), "nClusters", - maxStationsInVeloTrack ); - // for (int ii = 0; ii farray( prefix + "_TRACK_VELO_STATION_VECTOR", stations.begin(), stations.end(), "nClusters", - maxStationsInVeloTrack ); - - return StatusCode( test ); -} diff --git a/Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackMatch.cpp b/Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackMatch.cpp deleted file mode 100644 index 047bc26a..00000000 --- a/Phys/DecayTreeTupleTracking/src/TupleToolVeloTrackMatch.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" - -#include -#include - -/** - * \brief Fill information about velo tracks matching the flight direction of a downstream composite candidate - * The tool searches for velo tracks at LHCb::TrackLocation::Velo around a given direction, re-running the Velo tracking - * beforehand may be necessary - * - * -The cone angle can be set using the property "ConeRadius", the default value is 0.05 - * This is an approximation of the true angle, it is sqrt( (slopedifference_X)^2 + (slopedifference_Y)^2 ), - * Where slopedifference is the difference in slope between the velo track and the reference direction - * - * -The minimum distance of the VELO tracks from the best PV can be set using the property "MaxIPwrtBestPV", the default - * value is 0,5 mm - * - * -If ConeAroundMomentum=True: - * The reference direction is set to be the 3-momentum of the downstream candidate - * if False (default value) is the flight direction determined by the decay vertex and the associate PV - * - * -If sxratio(syratio) is the ratio between the slope dx/dz(dy/dz) of the velo track wrt the reference direction - * we define R - * R=sqrt( (1-sxratio)^2 + (1-syratio)^2 ) - * the "best velo" track is the one with the smaller R - * - * head_VM_cand_slope_X: dx/dz of reference direction - * head_VM_cand_slope_Y: dy/dz of reference direction - * head_VM_nvelotracks: number of velo tracks inside the cone - * head_VM_R: R of best velo track - * head_VM_IP: IP of best velo track wrt best PV - * head_VM_CD: cone angle best velo track - * head_VM_chi2: chi2 of velo track fit - * head_VM_index: index of best velo track - * head_VM_nMeas: number of measurements for the best velo track - * head_VM_fpos_X: X position at first state for best velo track - * head_VM_fpos_Y: Y position at first state for best velo track - * head_VM_fpos_Z: Z position at first state for best velo track - * head_VM_fpos_err_XX: XX error matrix of first state for best velo track - * head_VM_fpos_err_YY: YY error matrix of first state for best velo track - * head_VM_fpos_err_XY: ZZ error matrix of first state for best velo track - * head_VM_sloperatio_X: slope ratio X of best velo track wrt reference direction - * head_VM_sloperatio_Y: slope ratio Y of best velo track wrt reference direction - * head_VM_slope_X: dx/dz slope of best velo track - * head_VM_slope_Y: dy/dz slope of best velo track - * head_VM_slope_err_XX: XX error matrix of the slope for best velo track - * head_VM_slope_err_YY: YY error matrix of the slope for best velo track - * head_VM_slope_err_XY: YY error matrix of the slope for best velo track - * - * -If Verbose=True - * Same meaning as amove but for all velo tracks in the cone - * head_VM_array_fpos_X - * head_VM_array_fpos_Y - * head_VM_array_fpos_Z - * head_VM_array_fpos_err_XX - * head_VM_array_fpos_err_YY - * head_VM_array_fpos_err_XY - * head_VM_array_slope_X - * head_VM_array_slope_Y - * head_VM_array_slope_err_XX - * head_VM_array_slope_err_YY - * head_VM_array_slope_err_XY - * head_VM_array_sloperatio_X - * head_VM_array_sloperatio_Y - * head_VM_array_R - * head_VM_array_IP - * head_VM_array_CD - * head_VM_array_chi2 - * head_VM_array_nMeas - * - * @author Andrea Contu - * @date 2013-11-21 - */ -class TupleToolVeloTrackMatch : public TupleToolBase, public virtual IParticleTupleTool { - -public: - TupleToolVeloTrackMatch( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string& head, Tuples::Tuple& tuple, - IGeometryInfo const& ) override; - -private: - IDVAlgorithm* m_dva; - double m_slopediff; - bool m_momentumcone; - bool m_verbose; - double m_maxVbestPVdist; -}; - -using namespace LHCb; - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolVeloTrackMatch ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolVeloTrackMatch::TupleToolVeloTrackMatch( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_dva( 0 ), m_slopediff( 0 ), m_momentumcone( false ) { - declareInterface( this ); - declareProperty( "ConeAngle", m_slopediff = 0.05 ); - declareProperty( "ConeAroundMomentum", m_momentumcone = false ); - declareProperty( "VerboseInfo", m_verbose = false ); - declareProperty( "MaxIPwrtBestPV", m_maxVbestPVdist = 0.5 ); -} - -//============================================================================= -// Initialize -//============================================================================= -StatusCode TupleToolVeloTrackMatch::initialize() { - StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - m_dva = Gaudi::Utils::getIDVAlgorithm( contextSvc(), this ); - if ( !m_dva ) return Error( "Couldn't get parent DVAlgorithm", StatusCode::FAILURE ); - - return sc; -} - -//============================================================================= -// Fill -//============================================================================= -StatusCode TupleToolVeloTrackMatch::fill( const LHCb::Particle* /* top */, const LHCb::Particle* part, - const std::string& head, Tuples::Tuple& tuple, - IGeometryInfo const& geometry ) { - - const std::string prefix = fullName( head ); - StatusCode sc = StatusCode::SUCCESS; - - const unsigned int maxVeloTracks = 2000; - - std::vector vfirstpoints; - std::vector vslopes; - std::vector vslopesx, vslopesy; - std::vector vslopesxxerr, vslopesyyerr, vslopesxyerr; - std::vector vslopesxratio, vslopesyratio, vR; - std::vector vfpx, vfpy, vfpz; - std::vector vfpxxerr, vfpyyerr, vfpxyerr; - std::vector vconedist; - std::vector vbestip; - - double ipcut = m_maxVbestPVdist; - - double bestdt = 9999.; - double bestip = 9999.; - double nvelotracks = -1.; - double bestsloperatiox = 9999.; - double bestsloperatioy = 9999.; - double bestconedist = 9999.; - unsigned int besttrackindex = -1; - Gaudi::XYZPoint bestfposition; - Gaudi::SymMatrix3x3 bestfpositionerr; - Gaudi::XYZPoint bestslopes; - Gaudi::SymMatrix3x3 bestslopeserr; - - if ( !part->isBasicParticle() && part->endVertex() ) { - - Gaudi::LorentzVector lorvectmother = part->momentum(); - - bool conemom = m_momentumcone; - const VertexBase* aPV = NULL; - - if ( !m_momentumcone ) { - aPV = m_dva->bestVertex( part, geometry ); - if ( !aPV ) { - conemom = true; - ipcut = 9999.; - Warning( "Could not find best PV, falling back to momentum cone!" ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - } - } else { - conemom = true; - } - - double mpx = 9999.; - double mpy = 9999.; - double mpz = 9999.; - - if ( !conemom ) { - mpx = aPV->position().x() - part->endVertex()->position().x(); - mpy = aPV->position().y() - part->endVertex()->position().y(); - mpz = aPV->position().z() - part->endVertex()->position().z(); - } - - else { - mpx = lorvectmother.Px(); - mpy = lorvectmother.Py(); - mpz = lorvectmother.Pz(); - } - double msx = mpx / mpz; - double msy = mpy / mpz; - - LHCb::Track::Range vtrax = get( LHCb::TrackLocation::Velo ); - - if ( vtrax.size() == 0 ) { - return Warning( "Could not find any VELO track, you may need to re-run the VELO tracking", sc ); - } - - for ( LHCb::Track::Range::const_iterator tri = vtrax.begin(); tri != vtrax.end(); ++tri ) { - const Track* tmptrack = ( *tri ); - if ( tmptrack->type() == LHCb::Track::Types::Velo ) { - Gaudi::XYZPoint tmpfp; - Gaudi::SymMatrix3x3 fperror; - tmptrack->position( tmpfp, fperror ); - - Gaudi::XYZVector tmpslope; - Gaudi::SymMatrix3x3 slopeerror; - tmptrack->slopes( tmpslope, slopeerror ); - double dtx = msx - tmpslope.X(); - double dty = msy - tmpslope.Y(); - double dt = std::sqrt( dtx * dtx + dty * dty ); - double tmpR3d = sqrt( pow( ( 1 - tmpslope.X() / msx ), 2 ) + pow( ( 1 - tmpslope.Y() / msy ), 2 ) ); - - double ipbestpv = -1.; - double tmpvect2 = 0.; - double tmpscalar2 = 0.; - - if ( !conemom ) { - tmpvect2 = pow( ( tmpfp.X() - aPV->position().x() ), 2 ) + pow( ( tmpfp.Y() - aPV->position().y() ), 2 ) + - pow( ( tmpfp.Z() - aPV->position().z() ), 2 ); - tmpscalar2 = - pow( ( ( tmpfp.X() - aPV->position().x() ) * tmpslope.X() + - ( tmpfp.Y() - aPV->position().y() ) * tmpslope.Y() + ( tmpfp.Z() - aPV->position().z() ) ), - 2 ) / - ( tmpslope.X() * tmpslope.X() + tmpslope.Y() * tmpslope.Y() + tmpslope.Z() * tmpslope.Z() ); - ipbestpv = sqrt( tmpvect2 - tmpscalar2 ); - } - - if ( dt < m_slopediff && ipbestpv < ipcut ) { - if ( tmpR3d < bestdt ) { - bestdt = tmpR3d; - bestip = ipbestpv; - besttrackindex = nvelotracks; - bestfposition = tmpfp; - bestfpositionerr = fperror; - bestslopes = tmpslope; - bestslopeserr = slopeerror; - bestsloperatiox = tmpslope.X() / msx; - bestsloperatioy = tmpslope.Y() / msy; - bestconedist = dt; - } - ++nvelotracks; - vfpx.push_back( tmpfp.X() ); - vfpy.push_back( tmpfp.Y() ); - vfpz.push_back( tmpfp.Z() ); - vslopesx.push_back( tmpslope.X() ); - vslopesy.push_back( tmpslope.Y() ); - vslopesxxerr.push_back( slopeerror( 0, 0 ) ); - vslopesyyerr.push_back( slopeerror( 1, 1 ) ); - vslopesxyerr.push_back( slopeerror( 0, 1 ) ); - vfpxxerr.push_back( fperror( 0, 0 ) ); - vfpyyerr.push_back( fperror( 1, 1 ) ); - vfpxyerr.push_back( fperror( 0, 1 ) ); - vslopesxratio.push_back( tmpslope.X() / msx ); - vslopesyratio.push_back( tmpslope.Y() / msy ); - vR.push_back( tmpR3d ); - vbestip.push_back( ipbestpv ); - vconedist.push_back( dt ); - } - } - } - - tuple->column( prefix + "_VM_cand_slope_X", msx ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_cand_slope_Y", msy ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_nvelotracks", nvelotracks ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_R", bestdt ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_IP", bestip ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_CD", bestconedist ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_index", besttrackindex ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_fpos_X", bestfposition.X() ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_fpos_Y", bestfposition.Y() ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_fpos_Z", bestfposition.Z() ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_fpos_err_XX", bestfpositionerr( 0, 0 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_fpos_err_YY", bestfpositionerr( 1, 1 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_fpos_err_XY", bestfpositionerr( 0, 1 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_sloperatio_X", bestsloperatiox ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_sloperatio_Y", bestsloperatioy ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_slope_X", bestslopes.X() ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_slope_Y", bestslopes.Y() ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_slope_err_XX", bestslopeserr( 0, 0 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_slope_err_YY", bestslopeserr( 1, 1 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->column( prefix + "_VM_slope_err_XY", bestslopeserr( 0, 1 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - - if ( m_verbose ) { - tuple->farray( prefix + "_VM_array_fpos_X", vfpx, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_fpos_Y", vfpy, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_fpos_Z", vfpz, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_fpos_err_XX", vfpxxerr, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_fpos_err_YY", vfpyyerr, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_fpos_err_XY", vfpxyerr, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_slope_X", vslopesx, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_slope_Y", vslopesy, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_slope_err_XX", vslopesxxerr, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_slope_err_YY", vslopesyyerr, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_slope_err_XY", vslopesxyerr, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_sloperatio_X", vslopesxratio, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_sloperatio_Y", vslopesyratio, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_R", vR, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_IP", vbestip, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_VM_array_CD", vconedist, prefix + "_VM_nTP", maxVeloTracks ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - } - } else { - return Warning( "Particle " + prefix + " is not composite or does not have an endvertex!", sc ); - } - return sc; -} -- GitLab From 469ac8016980c31440916d61256cad983e5cc26b Mon Sep 17 00:00:00 2001 From: Christoph Hasse Date: Fri, 1 Oct 2021 10:06:34 +0200 Subject: [PATCH 54/82] RefBot going live! --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 83f96c65..174752d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,3 +42,7 @@ python-linting: # Lint a single file because much of the code in Analysis is yet to be checked whether it will be kept for run 3. # This one file has been updated to pass the linter checks! - flake8 --exclude '*.opts.py' --select=F,E71,E9,W1,W6 $(find Phys/FunTuple -name '*.py') + +include: + - project: 'lhcb-rta/reference-update-bot' + file: 'templates/ref-bot-ci-trigger-template.yml' -- GitLab From fb4f79aa8eea1b7830e898bbcd711b87a8d9ee88 Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Fri, 1 Oct 2021 19:49:48 +0200 Subject: [PATCH 55/82] Remove Phys/DecayTreeTupleDalitz and Phys/DecayTreeTupleMuonCalib --- AnalysisSys/tests/refs/configurables.ref | 1 - CMakeLists.txt | 2 - Phys/DecayTreeTupleDalitz/CMakeLists.txt | 30 - Phys/DecayTreeTupleDalitz/doc/release.notes | 38 - .../src/MCTupleToolDalitz.cpp | 71 -- .../src/MCTupleToolDalitz.h | 50 - .../src/TupleToolDalitz.cpp | 52 - .../src/TupleToolDalitz.h | 43 - .../src/TupleToolDalitz.icpp | 86 -- Phys/DecayTreeTupleMuonCalib/CMakeLists.txt | 40 - .../DecayTreeTupleMuonCalib/doc/release.notes | 69 -- .../src/TupleToolMuonIDCalib.cpp | 1053 ----------------- .../src/TupleToolMuonPid.cpp | 257 ---- 13 files changed, 1792 deletions(-) delete mode 100644 AnalysisSys/tests/refs/configurables.ref delete mode 100644 Phys/DecayTreeTupleDalitz/CMakeLists.txt delete mode 100644 Phys/DecayTreeTupleDalitz/doc/release.notes delete mode 100644 Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.cpp delete mode 100644 Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.h delete mode 100644 Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.cpp delete mode 100644 Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.h delete mode 100644 Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.icpp delete mode 100644 Phys/DecayTreeTupleMuonCalib/CMakeLists.txt delete mode 100644 Phys/DecayTreeTupleMuonCalib/doc/release.notes delete mode 100644 Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonIDCalib.cpp delete mode 100644 Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonPid.cpp diff --git a/AnalysisSys/tests/refs/configurables.ref b/AnalysisSys/tests/refs/configurables.ref deleted file mode 100644 index cbffade8..00000000 --- a/AnalysisSys/tests/refs/configurables.ref +++ /dev/null @@ -1 +0,0 @@ -{'DaVinciTrackRefitting': {'RefitParticleTracks': True, 'ParticleRefitter': True, 'TracksFromParticles': True}, 'JetTagging': {'LoKi__MuonTag': True, 'LoKi__SVTag': True, 'LoKi__ElectronTag': True, 'LoKi__TopoTag': True, 'LoKi__TopoTagDir': True, 'LoKi__JetTagTruthNew': True, 'LoKi__JetTagTruthMCPart': True, 'LoKi__SeedFinderNTrks': True, 'LoKi__JetTagTruth': True, 'LoKi__NNBTag': True, 'FilterJet': True, 'LoKi__IPTag': True}, 'DecayTreeTupleDalitz': {'TupleToolDalitz': True, 'MCTupleToolDalitz': True}, 'ParticleMakerChecker': {'ParticleEffPurMoni': True}, 'DecayTreeTupleMuonCalib': {'TupleToolMuonPid': True, 'TupleToolMuonIDCalib': True}, 'DaVinciAssociators': {'ChargedPP2MC': True, 'Particle2MCChi2': True, 'NeutralPP2MC': True, 'CompositeParticle2MCLinks': True, 'Particle2MCWithChi2': True, 'Particle2MCLinks': True, 'TestLinker': True}, 'RichPIDQC': {'JPsiMuMuConf': True, 'KshortPiPiConf': True, 'LambdaToProtonPionConf': True, 'DsToPhiPiConf': True, 'DstarToDzeroPiConf': True, 'RichPIDQCConf': True}, 'DecayTreeTupleBase': {'EventTuple': True, 'MCDecayTreeTuple': True, 'DecayTreeTuple': True, 'TupleToolDecay': True}, 'DaVinciMCTools': {'FilterEventByMCDecay': True, 'MCPrimVertexMaker': True, 'BackgroundCategoryViaRelations': True, 'MCReconstructed': True, 'DaVinciSmartAssociator': True, 'MCParticleMaker': True, 'FilterToFixOppositeBFractions': True, 'MCParticleLinkerMaker': True, 'IsBEvent': True, 'P2MCPFromProtoP': True, 'DumpParticle': True, 'BackgroundCategory': True, 'DaVinciAssociatorsWrapper': True, 'MCParticleArrayFilterAlg': True, 'Particle2BackgroundCategoryRelationsAlg': True, 'PrintDecayTreeTool': True, 'FilterMCParticleArrayByDecay': True}, 'MicroDSTTools': {'CaloHypoCloner': True, 'WeightsVectorCloner': True, 'ParticleCloner': True, 'SwimmingReportCloner': True, 'VertexBaseFromRecVertexCloner': True, 'MuonPIDCloner': True, 'FlavourTagCloner': True, 'VertexBaseFromRecVertexClonerNoTracks': True, 'RecVertexClonerWithTracks': True, 'VertexBaseFromRecVertexClonerWithTracks': True, 'FlavourTagDeepCloner': True, 'MCVertexCloner': True, 'ProtoParticleCloner': True, 'VertexCloner': True, 'TrackCloner': True, 'RecVertexClonerNoTracks': True, 'MCParticleCloner': True, 'RecVertexCloner': True, 'CaloClusterCloner': True}, 'DecayTreeTuple': {'TupleToolVeto': True, 'TupleToolPi0Info': True, 'TupleToolParticleStats': True, 'TupleToolTagging': True, 'TupleToolSubMass': True, 'TupleToolMassHypo': True, 'TupleToolDira': True, 'TupleToolAngles': True, 'TupleToolGeometry': True, 'TupleToolPropertime': True, 'TupleToolDecayTreeFitter': True, 'TupleToolPid': True, 'TupleToolPhotonInfo': True, 'TupleToolP2VV': True, 'TupleToolBremInfo': True, 'TupleToolSelResults': True, 'TupleToolNeutrinoReco': True, 'TupleToolParticleReFit': True, 'TupleToolIsolationTwoBody': True, 'TupleToolVtxIsoln': True, 'TupleToolSwimmingInfo': True, 'TupleToolCaloHypo': True, 'TupleToolKinematic': True}, 'DaVinciTrackScaling': {'TrackSmearState': True, 'OldTrackSmearState': True, 'TrackScaleState': True}, 'Particle2MCTruth': {'MCMatchObjP2MCRelator': True, 'P2MCRelatorAlg': True}, 'DaVinciAngleCalculators': {'P2VVAngleCalculator': True, 'Bs2JpsiPhiAngleCalculator': True, 'Bd2KstarMuMuAngleCalculator': True, 'MCBs2JpsiPhiAngleCalculator': True, 'MCBd2KstarMuMuAngleCalculator': True}, 'LoKiPhysMC': {'LoKi__HepMCParticleMaker': True, 'LoKi__PV2MC': True, 'LoKi__Hybrid__MCTupleTool': True, 'LoKi__PV2MCAlg': True, 'LoKi__P2MCW': True, 'LoKi__Track2MC': True, 'LoKi__P2MC': True}, 'LoKiGenMC': {'LoKi__MC2GenCollisionAlg': True, 'LoKi__HepMC2MC': True, 'LoKi__HepMC2MCAlg': True, 'LoKi__MC2GenCollision': True}, 'VertexFitCheck': {'VtxChecker': True, 'ProperTimeChecker': True, 'CheatedPVReFitter': True, 'PhotonChecker': True, 'PVChecker': True}, 'DecayTreeTupleReco': {'TupleToolPrimaries': True, 'TupleToolTrackInfo': True, 'TupleToolRICHPid': True, 'TupleToolCPU': True, 'TupleToolProtoPData': True, 'TupleToolRecoStats': True}, 'DisplVerticesMC': {'SaveParticlesFrom': True, 'MCDisplVertices': True}, 'Analysis': {'DummyAnalysisAlg': True}, 'FlavourTaggingChecker': {'CheatedSelection': True, 'BDecayTool': True, 'BTaggingInclusive': True, 'BOppositeMonitoring': True, 'BTaggingAnalysis': True, 'TaggingUtilsChecker': True, 'BTaggingChecker': True}, 'HltSelChecker': {'HltCorrelations': True, 'HltBackgroundCategory': True, 'Hlt2Statistics': True, 'FilterTrueTracks': True, 'ReadHltReport': True}, 'DaVinciMonitors': {'ANNPIDTool': True, 'MuonPlotTool': True, 'ParticleMonitor': True, 'MomentumPlotTool': True, 'MassPlotTool': True, 'CombinedPidPlotTool': True, 'MuIDMonitor': True, 'CaloPlotTool': True, 'SimplePlots': True, 'MuEffMonitor': True, 'RichPlotTool': True}, 'DecayTreeTupleANNPID': {'TupleToolANNPIDTraining': True, 'TupleToolANNPID': True}, 'JetAccessoriesMC': {'LoKi__HepMCJets2HepMCJets': True, 'LoKi__HEPMCJetMaker': True, 'LoKi__ParticleMaker': True, 'LoKi__HepMCJets2Jets': True, 'LoKi__HepMCJets2JetsDeltaR': True, 'LoKi__MCJetMaker': True, 'LoKi__MCJets2Jets': True, 'WZPlusJetHepMCSelector': True, 'LoKi__MCPartBHadronSeed': True, 'MCJets2JetsAlg': True, 'LoKi__PartonicJets2HepMCJets': True, 'ZPlusJetHepMCSelector': True}, 'LoKiAlgoMC': {'LoKi__DecayTruth': True, 'LoKi__Hybrid__MCParticleArrayFilter': True}, 'LoKiExample': {'LoKi__Bs2PsiPhi': True, 'LoKi__CCTest': True, 'LoKi__Phi_Makers': True, 'LoKi__Fitters': True, 'LoKi__PhiMC': True, 'LoKi__DecayDescriptor': True, 'LoKi__MCMergedPi0s': True, 'LoKi__Phi': True, 'LoKi__SelectParticles': True, 'LoKi__MemFun': True, 'LoKi__SelectTracks': True, 'LoKi__TestHybrid': True, 'LoKi__GenDecayDescriptor': True, 'LoKi__MCMuons': True, 'LoKi__Track2MCEx': True, 'LoKi__MCSelect': True, 'LoKi__CheckMC_Bs2PsiPhi': True, 'LoKi__PhiK_Dalitz': True, 'LoKi__IPCheck': True, 'LoKi__Example__PV2MCEx': True, 'LoKi__MCDecayDescriptor': True, 'LoKi__TestFunctor': True, 'LoKi__DCCheck': True, 'LoKi__HelloWorld': True, 'LoKi__Bs2PsiPhi_NoMC': True}, 'DecayTreeTupleTrigger': {'TupleToolTISTOS': True, 'TupleToolL0Data': True, 'TupleToolTrigger': True, 'TupleToolStripping': True, 'TupleToolTriggerRecoStats': True, 'TupleToolL0Calo': True, 'TupleToolEventInfo': True}, 'DSTWriters': {'SelDSTWriter': True, 'FixInputCopyStream': True, 'StripDSTWriter': True, 'MicroDSTWriter': True}, 'DecayTreeTupleMC': {'MCTupleToolInteractions': True, 'MCTupleToolPrimaries': True, 'MCTupleToolPID': True, 'MCTupleToolReconstructed': True, 'MCTupleToolPrompt': True, 'MCTupleToolDecayType': True, 'MCTupleToolAngles': True, 'TupleToolGeneration': True, 'TupleToolMCTruth': True, 'TupleToolMCBackgroundInfo': True, 'MCTupleToolKinematic': True, 'MCTupleToolEventType': True, 'MCTupleToolHierarchy': True, 'MCTupleToolP2VV': True}, 'DecayTreeTupleJets': {'TupleToolWZJets': True, 'TupleToolJetTag': True, 'TupleToolJets': True, 'TupleToolJetRelations': True}, 'MicroDSTAlgorithm': {'CopyParticle2TPRelations': True, 'CopySwimmingReports': True, 'CopyParticle2LHCbIDs': True, 'CopyParticle2BackgroundCategory': True, 'CopyGaudiNumbers': True, 'CopyMCHeader': True, 'CopyRecSummary': True, 'CopyPrimaryVertices': True, 'CopyParticle2PVWeightedRelations': True, 'CopyODIN': True, 'CopyParticle2RelatedInfo': True, 'CopyFlavourTag': True, 'CopyParticle2MCRelations': True, 'CopyParticle2PVRelations': True, 'CopyL0DUReport': True, 'CopyParticles': True, 'CopyParticle2TisTosDecisions': True, 'CopyParticle2PVMap': True, 'CopyRecHeader': True, 'CopyMCParticles': True, 'MoveDataObject': True, 'CopyProtoParticles': True, 'CopyPVWeights': True, 'CopyHltDecReports': True}, 'TrackSmearing': {'TrackSmeared': True, 'IpImprover': True}} diff --git a/CMakeLists.txt b/CMakeLists.txt index c2778f07..6134869e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,10 +44,8 @@ lhcb_add_subdirectories( Phys/DecayTreeTuple Phys/DecayTreeTupleANNPID Phys/DecayTreeTupleBase - Phys/DecayTreeTupleDalitz Phys/DecayTreeTupleJets Phys/DecayTreeTupleMC - Phys/DecayTreeTupleMuonCalib Phys/DecayTreeTupleReco Phys/DecayTreeTupleTrigger Phys/DSTWriters diff --git a/Phys/DecayTreeTupleDalitz/CMakeLists.txt b/Phys/DecayTreeTupleDalitz/CMakeLists.txt deleted file mode 100644 index 720a70d7..00000000 --- a/Phys/DecayTreeTupleDalitz/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -############################################################################### -# (c) Copyright 2000-2021 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. # -############################################################################### -#[=======================================================================[.rst: -Phys/DecayTreeTupleDalitz -------------------------- -#]=======================================================================] - -gaudi_add_module(DecayTreeTupleDalitz - SOURCES - src/MCTupleToolDalitz.cpp - src/TupleToolDalitz.cpp - LINK - Analysis::DecayTreeTupleBaseLib - Boost::headers - Gaudi::GaudiAlgLib - LHCb::MCEvent - LHCb::PartPropLib - LHCb::PhysEvent - Phys::DaVinciInterfacesLib - Phys::DaVinciKernelLib - Phys::DaVinciMCKernelLib -) diff --git a/Phys/DecayTreeTupleDalitz/doc/release.notes b/Phys/DecayTreeTupleDalitz/doc/release.notes deleted file mode 100644 index d1c2f59e..00000000 --- a/Phys/DecayTreeTupleDalitz/doc/release.notes +++ /dev/null @@ -1,38 +0,0 @@ -!----------------------------------------------------------------------------- -! Package : Phys/DecayTreeTupleDalitz -! Responsible : Chris Jones -! Purpose : Dalitz tools -!----------------------------------------------------------------------------- - -!=================== DecayTreeTupleDalitz v1r3 2015-04-22 ==================== - - 2015-03-23 - O. Deschamps - - reduce verbosity and fix compilation error - - 2015-03-15 - O. Deschamps - - make the branch name CC-independant - -!=================== DecayTreeTupleDalitz v1r2 2015-02-26 ==================== - -! 2015-02-24 - O. Deschamps - - fix problem with Dalitz variable naming when daughter vector has not a constant order (stable::sort by PID) - -!========================= DecayTreeTupleDalitz v1r1p1 2014-04-02 ========================= - -! 2014-04-02 - Chris Jones - - Minor code cleanup. - -!========================= DecayTreeTupleDalitz v1r1 2013-12-18 ========================= - -! 2013-11-18 - Chris Jones - - Fix a bug in setting the prefix name properly. - - Try and fix a issue when the tool is wrong on Wrong Sign decays ... - -!========================= DecayTreeTupleDalitz v1r0 2012-11-30 ========================= - -! 2012-11-29 - Marco Clemencic - - Added CMake configuration file. - -! 2012-11-22 - Chris Jones - - First version. Split of from monolithic Phys/DecayTreeTuple package. - Contains the 'Dalitz' tools, that share code. diff --git a/Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.cpp b/Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.cpp deleted file mode 100644 index 4b9432e3..00000000 --- a/Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -// Include files - -#include -#include - -// local -#include "MCTupleToolDalitz.h" - -//----------------------------------------------------------------------------- -// Implementation file for class : MCTupleToolDalitz -// -// 2009-02-17 : Patrick Koppenburg -//----------------------------------------------------------------------------- - -// Declaration of the Tool Factory -DECLARE_COMPONENT( MCTupleToolDalitz ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -MCTupleToolDalitz::MCTupleToolDalitz( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_ppSvc( 0 ) { - declareInterface( this ); -} -//============================================================================= -// Destructor -//============================================================================= -MCTupleToolDalitz::~MCTupleToolDalitz() {} - -//============================================================================= -//============================================================================= -// Fill -//============================================================================= -StatusCode MCTupleToolDalitz::fill( const LHCb::MCParticle* mother, const LHCb::MCParticle* part, - const std::string& head, Tuples::Tuple& tuple ) { - const std::string prefix = fullName( head ); - - if ( 0 == part ) return StatusCode::FAILURE; - if ( msgLevel( MSG::DEBUG ) ) - debug() << "Decay of " << part->particleID().pid() << " with mother " << mother << endmsg; - LHCb::MCParticle::ConstVector dauts; - for ( SmartRefVector::const_iterator iv = part->endVertices().begin(); - iv != part->endVertices().end(); ++iv ) { - if ( !( *iv )->isDecay() ) continue; - if ( msgLevel( MSG::VERBOSE ) ) - verbose() << "Decay vertex of type " << ( *iv )->type() << " with " << ( *iv )->products().size() << " products" - << endmsg; - const SmartRefVector pr = ( *iv )->products(); - for ( SmartRefVector::const_iterator ip = pr.begin(); ip != pr.end(); ++ip ) { - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Pushing back " << ( *ip )->particleID().pid() << endmsg; - dauts.push_back( *ip ); - } - break; - } - - if ( 2 >= dauts.size() ) { - return Warning( "Will not fill Dalitz of two body decay " + prefix, StatusCode::SUCCESS, 0 ); - } - - return fill( dauts, "MC", tuple, ( part->particleID().pid() < 0 ) ); -} diff --git a/Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.h b/Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.h deleted file mode 100644 index 4170b1e0..00000000 --- a/Phys/DecayTreeTupleDalitz/src/MCTupleToolDalitz.h +++ /dev/null @@ -1,50 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#ifndef MCTUPLETOOLDALITZ_H -#define MCTUPLETOOLDALITZ_H 1 - -// Include files -// from Gaudi -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Event/MCParticle.h" -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "Kernel/Escape.h" -#include "Kernel/IMCParticleTupleTool.h" -#include "Kernel/IParticlePropertySvc.h" -#include "Kernel/ParticleProperty.h" - -// Boost -#include - -/** @class MCTupleToolDalitz MCTupleToolDalitz.h - * - * Fills square masses of all combinations of direct daughters - * - * @author Patrick Koppenburg - * @date 2009-02-17 - */ -class MCTupleToolDalitz : public TupleToolBase, virtual public IMCParticleTupleTool { - -public: - /// Standard constructor - MCTupleToolDalitz( const std::string& type, const std::string& name, const IInterface* parent ); - - virtual ~MCTupleToolDalitz(); ///< Destructor - - /// The filling method - StatusCode fill( const LHCb::MCParticle*, const LHCb::MCParticle*, const std::string&, Tuples::Tuple& ) override; - -private: - // Horrid way of sharing code. Should use inheritance instead ... -#include "TupleToolDalitz.icpp" -}; -#endif // MCTUPLETOOLDALITZ_H diff --git a/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.cpp b/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.cpp deleted file mode 100644 index bcec1d4d..00000000 --- a/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#include "Event/Particle.h" - -#include "TupleToolDalitz.h" - -//----------------------------------------------------------------------------- -// Implementation file for class : TupleToolDalitz -// -// 2009-02-17 : Patrick Koppenburg -//----------------------------------------------------------------------------- - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolDalitz ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolDalitz::TupleToolDalitz( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_ppSvc( 0 ) { - declareInterface( this ); -} - -//============================================================================= -// Fill -//============================================================================= -StatusCode TupleToolDalitz::fill( const LHCb::Particle* mother, const LHCb::Particle* part, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& ) { - const std::string prefix = fullName( head ); - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "Dalitz fill " << prefix << " " << mother << " " << part << endmsg; - if ( 0 == part ) return StatusCode::FAILURE; - const LHCb::Particle::ConstVector& dauts = part->daughtersVector(); - if ( 2 >= dauts.size() ) { - debug() << "Will not fill Dalitz of two body decay " << prefix << endmsg; - return StatusCode::SUCCESS; - } - if ( part->particleID().abspid() == 98 ) { - debug() << "Will not fill Dalitz for particle type CELLjet " << endmsg; - return StatusCode::SUCCESS; - } - - return fill( dauts, head, tuple, ( part->particleID().pid() < 0 ) ); -} diff --git a/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.h b/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.h deleted file mode 100644 index a0e34835..00000000 --- a/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.h +++ /dev/null @@ -1,43 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#pragma once - -// Include files -// from Gaudi -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Event/Particle.h" -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "Kernel/Escape.h" -#include "Kernel/IParticlePropertySvc.h" -#include "Kernel/IParticleTupleTool.h" -#include "Kernel/ParticleProperty.h" -// Boost -#include - -/** @class TupleToolDalitz TupleToolDalitz.h - * - * Fills square masses of all combinations of direct daughters - * - * @author Patrick Koppenburg - * @date 2009-02-17 - */ -class TupleToolDalitz : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolDalitz( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - // Horrid way of sharing code. Should use inheritance instead ... -#include "TupleToolDalitz.icpp" -}; diff --git a/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.icpp b/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.icpp deleted file mode 100644 index b37b62ce..00000000 --- a/Phys/DecayTreeTupleDalitz/src/TupleToolDalitz.icpp +++ /dev/null @@ -1,86 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -private: -//============================================================================= -// The templated method filling the tuple for Particles and MCParticles -//============================================================================= -/// The templated method that does it all -template -StatusCode fill( const std::vector& dauts /// daughters - , - const std::string& head /// header - , - Tuples::Tuple& tuple /// tuple - , - bool revert ) /// revert all PID (because mother is antiparticle) -{ - - const std::string prefix = fullName( head ); - bool test = true; - // sort out daughters vector - std::vector daughters( dauts ); // local copies to sort - const LHCb::IParticlePropertySvc* pp = ppSvc(); - std::stable_sort( daughters.begin(), daughters.end(), [revert, pp]( const TYPE* c1, const TYPE* c2 ) { - int sign = ( revert ) ? -1 : 1; - int p1 = ( pp->find( c1->particleID() )->selfcc() ) ? c1->particleID().pid() : sign * c1->particleID().pid(); - int p2 = ( pp->find( c2->particleID() )->selfcc() ) ? c2->particleID().pid() : sign * c2->particleID().pid(); - bool comp = std::make_pair( p1, c1->key() ) > std::make_pair( p2, c2->key() ); - return comp; - } ); - std::map used; - - for ( typename std::vector::const_iterator i = daughters.begin(); i != daughters.end(); ++i ) { - const std::string n1 = particleName( ( *i )->particleID(), revert ); - const Gaudi::LorentzVector& p1 = ( *i )->momentum(); - for ( typename std::vector::const_iterator j = daughters.begin(); i != j; ++j ) { - const std::string n2 = particleName( ( *j )->particleID(), revert ); - const Gaudi::LorentzVector p = p1 + ( *j )->momentum(); - const std::string basename = prefix + "_Dalitz_" + n1 + "_" + n2 + "_M2"; - std::string name = basename; - if ( used.find( basename ) != used.end() ) { - unsigned int add = used[basename]; - name = basename + "_" + boost::lexical_cast( add ); - used[basename] = add + 1; - Info( "Renaming duplicate to " + name, StatusCode::SUCCESS, 1 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - } else { - used[basename] = 1; - } - test &= tuple->column( name, p.M2() ); - } - } - return StatusCode( test ); -} - -/// get name of particle or anti-particle -std::string particleName( const LHCb::ParticleID& id, bool revert ) const { - const LHCb::ParticleProperty* ppp = ppSvc()->find( id ); - if ( !ppp ) { - std::ostringstream mess; - mess << "Unknown ParticleID " << id; - Exception( mess.str() ); - } - return Decays::escape( ( revert ? ppp->antiParticle()->particle() : ppp->particle() ) ); -} - -/// get particle property serivce -const LHCb::IParticlePropertySvc* ppSvc() const { return m_ppSvc; } - -public: -StatusCode initialize() override { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isSuccess() ) { m_ppSvc = svc( "LHCb::ParticlePropertySvc", true ); } - return sc; -} - -private: -LHCb::IParticlePropertySvc* m_ppSvc; diff --git a/Phys/DecayTreeTupleMuonCalib/CMakeLists.txt b/Phys/DecayTreeTupleMuonCalib/CMakeLists.txt deleted file mode 100644 index 7eb9917f..00000000 --- a/Phys/DecayTreeTupleMuonCalib/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################### -# (c) Copyright 2000-2021 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. # -############################################################################### -#[=======================================================================[.rst: -Phys/DecayTreeTupleMuonCalib ----------------------------- -#]=======================================================================] - -gaudi_add_module(DecayTreeTupleMuonCalib - SOURCES - src/TupleToolMuonIDCalib.cpp - src/TupleToolMuonPid.cpp - LINK - Analysis::DecayTreeTupleBaseLib - Boost::headers - Gaudi::GaudiAlgLib - Gaudi::GaudiKernel - GSL::gsl - LHCb::DetDescLib - LHCb::DigiEvent - LHCb::EventBase - LHCb::GenEvent - LHCb::LHCbKernel - LHCb::MCAssociators - LHCb::MCEvent - LHCb::MuonDetLib - LHCb::PhysEvent - LHCb::RecEvent - LHCb::TrackEvent - Phys::DaVinciInterfacesLib - Phys::DaVinciMCKernelLib - Rec::TrackInterfacesLib -) diff --git a/Phys/DecayTreeTupleMuonCalib/doc/release.notes b/Phys/DecayTreeTupleMuonCalib/doc/release.notes deleted file mode 100644 index a6691179..00000000 --- a/Phys/DecayTreeTupleMuonCalib/doc/release.notes +++ /dev/null @@ -1,69 +0,0 @@ -!----------------------------------------------------------------------------- -! Package : Phys/DecayTreeTupleMuonCalib -! Responsible : Chris Jones -! Purpose : tuple tools for Muon PID calibration -!----------------------------------------------------------------------------- - -!================== DecayTreeTupleMuonCalib v1r6 2015-12-04 ================== - -! 2015-12-03 - Ricardo Vazquez Gomez - - Include extra options in TupleToolMuonVariables - - Add the TupleZVIso.cpp to the DecayTreeTupleMuonCalib package - -! 2015-11-01 - Gerhard Raven - - replace endreq with endmsg - -!================= DecayTreeTupleMuonCalib v1r5 2015-10-019 ================== - -! 2015-10-09 - Ricardo Vazquez Gomez - - Control the momentum estimate using muon chambers via a flag. - -! 2015-07-30 - Ricardo Vazquez Gomez - - Added momentum estimate with and without M1 to TupleToolMuonIDCalib.cpp - -!========================= DecayTreeTupleMuonCalib v1r4 2015-06-02 ========================= - -! 2015-05-26 - Ricardo Vazquez Gomez - - Quick fix in the MuonIDCalib tool - -! 2015-05-20 - Ricardo Vazquez Gomez - - Added the muon hit time and the momentum from the muonTrack - -!========================= DecayTreeTupleMuonCalib v1r3 2014-10-30 ========================= - -! 2014-08-28 - Ricardo Vazquez Gomez - - All hits stored only for particle lab2 in the lab frame. - -! 2014-08-27 - Ricardo Vazquez Gomez - - Add the possibility to store all the hits of the muon system. - -!========================= DecayTreeTupleMuonCalib v1r2p1 2013-06-13 ========================= - -! 2013-05-17 - Chris Jones - - Fix clang warning for variable self-assignment - -!========================= DecayTreeTupleMuonCalib v1r2 2013-05-07 ========================= - -! 2013-04-15 - Jose Helder Lopes - - Implemented code to extrapolate a track to the muon system and find the region - it crosses in each station. - - Added the region of the extrapolated track in M2 to the ntuple. - -!========================= DecayTreeTupleMuonCalib v1r1 2013-04-05 ========================= - -! 2013-03-05 - Kazu Akiba - - Adding muondet to TupleToolMuonPid. Had to change the requirements file too. - No variables were added using the muon det element yet. - -! 2013-02-26 - Chris Jones - - Fix -pedantic compilation warnings - -!========================= DecayTreeTupleMuonCalib v1r0 2012-11-30 ========================= - -! 2012-11-29 - Marco Clemencic - - Added CMake configuration file. - - Modified requirements to simplify auto conversion to CMake. - -! 2012-11-22 - Chris Jones - - First version. Split of from monolithic Phys/DecayTreeTuple package. - Contains the tools for Muon PID calibration. diff --git a/Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonIDCalib.cpp b/Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonIDCalib.cpp deleted file mode 100644 index d7d14728..00000000 --- a/Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonIDCalib.cpp +++ /dev/null @@ -1,1053 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "TrackInterfaces/ITrackExtrapolator.h" - -#include "MuonDet/DeMuonDetector.h" -#include "MuonDet/MuonBasicGeometry.h" - -#include "Kernel/IBIntegrator.h" -#include "Kernel/IDistanceCalculator.h" -#include "Kernel/IPVReFitter.h" -#include "Kernel/IParticle2MCAssociator.h" -#include "Kernel/IParticleTupleTool.h" -#include "Kernel/LHCbID.h" -#include "Kernel/MuonTileID.h" -#include "Kernel/Particle2MCLinker.h" - -#include "Event/GenHeader.h" -#include "Event/IntLink.h" -#include "Event/MCHeader.h" -#include "Event/MCMuonDigit.h" -#include "Event/MCMuonDigitInfo.h" -#include "Event/MuonCoord.h" -#include "Event/MuonDigit.h" -#include "Event/Particle.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/PhysicalConstants.h" - -#include "gsl/gsl_math.h" - -#include - -/** - * @author Fatima Soomro - * @date 2011-09-26 - */ -class TupleToolMuonIDCalib : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolMuonIDCalib( const std::string& type, const std::string& name, const IInterface* parent ); - - /// Loop over differnt conesizes and fill the variables into the tuple - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - StatusCode fillVars( const LHCb::Particle* part, std::string, Tuples::Tuple&, IGeometryInfo const& ); - void LoadMuonGeometry(); - StatusCode fillCoordVectors(); - double foiX( const int& station, const int& region, const double& p, const double& dx ); - double foiY( const int& station, const int& region, const double& p, const double& dy ); - StatusCode FindFieldPolarity(); - bool linFit( int& FromM1 ); - bool calculatePt( int& FromM1 ); - bool estrapola( IGeometryInfo const& geometry ); - - int m_NFoi; // look for hits winhin m_NFoi*Foi */ - std::string m_particlesPath; - - // FOIs parameters: - // function that defines the field of interest size - // formula is p(1) + p(2)*momentum+p(3)*exp(-p(4)*momentum) - std::vector m_xfoiParam1; - std::vector m_xfoiParam2; - std::vector m_xfoiParam3; - std::vector m_yfoiParam1; - std::vector m_yfoiParam2; - std::vector m_yfoiParam3; - - //-------------------------- - // Muon Detector variables: - //-------------------------- - - int m_NStation; /// Number of stations - int m_NRegion; /// Number of regions - // Names of the station - std::vector m_stationNames; - // fill local arrays of pad sizes and region sizes - DeMuonDetector* m_mudet; - - // track state @ M1 - const LHCb::State* m_stateP; - - // These are indexed [station] - std::vector m_stationZ; // station position - double m_trackX[5]; // position of track in x(mm) in each station - double m_trackY[5]; // position of track in y(mm) in each station - - std::string m_extrapolatorName; - ITrackExtrapolator* m_extrapolator; ///< extrapolator - double m_TextraX[5]; // x(mm) position of extrapolated track in each station - double m_TextraY[5]; // y(mm) position of extrapolated track in each station - double m_ms2X[5]; // ms error on x(mm) position in each station - double m_ms2Y[5]; // ms error on y(mm) position in each station - double m_TextraReg[5]; // region crossed by the extrapolated track - - // closest hit in FOI[station] ==> input for linFit, the linear fit - double m_smalldist_X[5]; - double m_smalldist_Y[5]; - double m_smalldist_Z[5]; - double m_smalldist_dX[5]; - double m_smalldist_dY[5]; - double m_smalldist_dZ[5]; - - // linear fit results - double m_sx, m_sy; - double m_bx, m_by; - double m_errbx, m_errsx, m_covbsx; - double m_errby, m_errsy, m_covbsy; - double m_chi2x, m_chi2y; - - // pt calculation - std::vector m_ParabolicCorrection; - std::vector m_resParams; - double m_Constant; - IBIntegrator* m_bIntegrator; // magnetic field tool - double m_FieldPolarity; - - double m_4qOverP; - double m_4sigmaQOverP2; - double m_4pZM1; - double m_4pXPvtx; - double m_4pYPvtx; - double m_4pZPvtx; - - double m_5qOverP; - double m_5sigmaQOverP2; - double m_5pZM1; - double m_5pXPvtx; - double m_5pYPvtx; - double m_5pZPvtx; - - std::vector m_hitInFOIx; - std::vector m_hitInFOIdx; - std::vector m_hitInFOIy; - std::vector m_hitInFOIdy; - std::vector m_hitInFOIz; - std::vector m_hitInFOIdz; - std::vector m_hitInFOIuncrossed; - std::vector m_hitInFOIID; - std::vector m_hitInFOITDC1; - std::vector m_hitInFOITDC2; - std::vector m_allMuonHitsX; - std::vector m_allMuonHitsDX; - std::vector m_allMuonHitsY; - std::vector m_allMuonHitsDY; - std::vector m_allMuonHitsZ; - std::vector m_allMuonHitsDZ; - std::vector m_allMuonHitsUncrossed; - std::vector m_allMuonHitsTDC1; - std::vector m_allMuonHitsTDC2; - std::vector m_allMuonHitsID; - bool m_doVerbose; - bool m_estimate; - - // local array of region sizes - std::vector m_regionInnerX; // inner edge in abs(x) - std::vector m_regionOuterX; // outer edge in abs(x) - std::vector m_regionInnerY; // inner edge in abs(y) - std::vector m_regionOuterY; // outer edge in abs(y) - - // Store x,dx,y,dy of each coord - class coordExtent_ { - public: - coordExtent_( double x, double dx, double y, double dy, double z, double dz, bool uncrossed, int digitTDC1, - int digitTDC2, LHCb::MuonCoord* pCoord ) - : m_x( x ) - , m_dx( dx ) - , m_y( y ) - , m_dy( dy ) - , m_z( z ) - , m_dz( dz ) - , m_uncrossed( uncrossed ) - , m_digitTDC1( digitTDC1 ) - , m_digitTDC2( digitTDC2 ) - , m_pCoord( pCoord ){}; - double m_x; - double m_dx; - double m_y; - double m_dy; - double m_z; - double m_dz; - bool m_uncrossed; - int m_digitTDC1; - int m_digitTDC2; - LHCb::MuonCoord* m_pCoord; - }; - // vector of positions of coords (innner vector coords, - // outer is [station* m_NRegion + region ] - std::vector> m_coordPos; -}; - -using namespace LHCb; -using namespace Gaudi::Units; -using namespace Gaudi; - -// Declaration of the Algorithm Factory -DECLARE_COMPONENT( TupleToolMuonIDCalib ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolMuonIDCalib::TupleToolMuonIDCalib( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); - declareProperty( "NFoi", m_NFoi = 2 ); - declareProperty( "XFOIParameter1", m_xfoiParam1 ); - declareProperty( "XFOIParameter2", m_xfoiParam2 ); - declareProperty( "XFOIParameter3", m_xfoiParam3 ); - declareProperty( "YFOIParameter1", m_yfoiParam1 ); - declareProperty( "YFOIParameter2", m_yfoiParam2 ); - declareProperty( "YFOIParameter3", m_yfoiParam3 ); - declareProperty( "isVerbose", m_doVerbose = false ); - declareProperty( "MomentumEstimate", m_estimate = true ); - - std::vector tmp1 = boost::assign::list_of( 0.015 )( 0.29 ); - declareProperty( "resParams", m_resParams = tmp1 ); - - std::vector tmp2 = boost::assign::list_of( 1.04 )( 0.14 ); - declareProperty( "ParabolicCorrection", m_ParabolicCorrection = tmp2 ); - - declareProperty( "ConstantCorrection", m_Constant = 0. * Gaudi::Units::MeV ); - declareProperty( "Extrapolator", m_extrapolatorName = "TrackMasterExtrapolator" ); -} - -//============================================================================= -// Fill the tuple -//============================================================================= -StatusCode TupleToolMuonIDCalib::fill( const LHCb::Particle* /* top */, const LHCb::Particle* part, - const std::string& head, Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - // nothing for particles that are not Bs - if ( !part->isBasicParticle() || NULL == part->proto() ) return StatusCode::SUCCESS; - - LoadMuonGeometry(); - if ( msgLevel( MSG::DEBUG ) ) debug() << "Fatima: Loaded Geometry in TupleToolMuIDCalib" << endmsg; - - m_bIntegrator = tool( "BIntegrator" ); - if ( !m_bIntegrator ) return StatusCode::FAILURE; - - m_extrapolator = tool( m_extrapolatorName, "MuEffExtrap", this ); - if ( !m_extrapolator ) return StatusCode::FAILURE; - - StatusCode sc = fillCoordVectors(); - if ( !sc ) error() << "couldnt fillCoorVectors!!!" << endmsg; - debug() << "Fatima: fillCoordVectors in TupleToolMuIDCalib" << endmsg; - - m_FieldPolarity = 1; - StatusCode sc2 = FindFieldPolarity(); - if ( !sc2 ) error() << "couldnt determine field polarity !!" << endmsg; - - const std::string prefix = fullName( head ); - StatusCode sc3 = fillVars( part, prefix, tuple, geometry ); - return sc3; -} - -//========================================================================== -// Load the geometry -//========================================================================== - -void TupleToolMuonIDCalib::LoadMuonGeometry() { - m_NStation = 0; - m_NRegion = 0; - MuonBasicGeometry basegeometry( detSvc(), msgSvc() ); - m_NStation = basegeometry.getStations(); - m_NRegion = basegeometry.getRegions(); - debug() << "stations and regions from MuonGeometry are " << m_NStation << " " << m_NRegion << endmsg; - - int i = 0; - while ( i < m_NStation ) { - m_stationNames.push_back( basegeometry.getStationName( i ) ); - debug() << " station " << i << " " << m_stationNames[i] << endmsg; - i++; - } - m_mudet = getDet( "/dd/Structure/LHCb/DownstreamRegion/Muon" ); - // set the size of the local vectors - m_regionInnerX.resize( m_NStation ); - m_regionOuterX.resize( m_NStation ); - m_regionInnerY.resize( m_NStation ); - m_regionOuterY.resize( m_NStation ); - for ( int station = 0; station < m_NStation; station++ ) { - m_stationZ.push_back( m_mudet->getStationZ( station ) ); - m_regionInnerX[station] = m_mudet->getInnerX( station ); - m_regionOuterX[station] = m_mudet->getOuterX( station ); - m_regionInnerY[station] = m_mudet->getInnerY( station ); - m_regionOuterY[station] = m_mudet->getOuterY( station ); - } -} - -//========================================================================== -// fill vectors of x,y,z positions for the MuonCoords -//========================================================================== - -StatusCode TupleToolMuonIDCalib::fillCoordVectors() { - - // m_HitInTrk.clear(); - m_coordPos.clear(); - m_coordPos.resize( m_NStation * m_NRegion ); - m_hitInFOIx.clear(); - m_hitInFOIdx.clear(); - m_hitInFOIy.clear(); - m_hitInFOIdy.clear(); - m_hitInFOIz.clear(); - m_hitInFOIdz.clear(); - m_hitInFOIuncrossed.clear(); - m_hitInFOIID.clear(); - m_hitInFOITDC1.clear(); - m_hitInFOITDC2.clear(); - m_allMuonHitsX.clear(); - m_allMuonHitsDX.clear(); - m_allMuonHitsY.clear(); - m_allMuonHitsDY.clear(); - m_allMuonHitsZ.clear(); - m_allMuonHitsDZ.clear(); - m_allMuonHitsUncrossed.clear(); - m_allMuonHitsID.clear(); - m_allMuonHitsTDC1.clear(); - m_allMuonHitsTDC2.clear(); - - // get the MuonCoords for each station in turn - LHCb::MuonCoords* coords = NULL; - if ( exist( LHCb::MuonCoordLocation::MuonCoords ) ) - coords = get( LHCb::MuonCoordLocation::MuonCoords ); - if ( !coords ) { - err() << "Cannot retrieve MuonCoords " << endmsg; - return StatusCode::FAILURE; - } - - // loop over the coords - LHCb::MuonCoords::const_iterator iCoord; - for ( iCoord = coords->begin(); iCoord != coords->end(); iCoord++ ) { - int region = ( *iCoord )->key().region(); - int station = ( *iCoord )->key().station(); - bool uncrossed = ( *iCoord )->uncrossed(); - int digitTDC1 = ( *iCoord )->digitTDC1(); - int digitTDC2 = ( *iCoord )->digitTDC2(); - LHCb::MuonTileID tile = ( *iCoord )->key(); - auto tilePosition = m_mudet->position( tile ); - if ( !tilePosition ) { - warning() << "Failed to get x,y,z of tile " << tile << endmsg; - continue; - } - auto x = tilePosition->position.x(); - auto y = tilePosition->position.y(); - auto z = tilePosition->position.z(); - auto dx = tilePosition->dX; - auto dy = tilePosition->dY; - auto dz = tilePosition->dZ; - m_coordPos[station * m_NRegion + region].push_back( - coordExtent_( x, dx, y, dy, z, dz, uncrossed, digitTDC1, digitTDC2, *iCoord ) ); - // m_HitInTrk.push_back(false); - } - - return StatusCode::SUCCESS; -} - -// return the FOI in x in a station and region for momentum (in MeV/c) -// this is a simpler version of the parameterization: -// foi = par0 + par2*exp(-par3*p) -//============================================================================= -double TupleToolMuonIDCalib::foiX( const int& station, const int& region, const double& p, const double& dx ) { - //============================================================================= - const double temp_x = ( m_xfoiParam1[station * m_NRegion + region] + - m_xfoiParam2[station * m_NRegion + region] * - std::exp( -m_xfoiParam3[station * m_NRegion + region] * p / Gaudi::Units::GeV ) ) * - dx; - // in the future optimize this checking that 2*dx =m_padSizeX[station * m_NRegion + region] - // then eliminates dx from function - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "from FOIX " << temp_x << endmsg; - - return temp_x; -} - -// return the FOI in y in a station and region for momentum (in MeV/c) -//============================================================================= -double TupleToolMuonIDCalib::foiY( const int& station, const int& region, const double& p, const double& dy ) { - //============================================================================= - const double temp_y = ( m_yfoiParam1[station * m_NRegion + region] + - m_yfoiParam2[station * m_NRegion + region] * - std::exp( -m_yfoiParam3[station * m_NRegion + region] * p / Gaudi::Units::GeV ) ) * - dy; - - if ( msgLevel( MSG::VERBOSE ) ) verbose() << "from FOIY " << temp_y << endmsg; - - return temp_y; -} - -//============================================================================= -// fill Xs, Ys and DistAve -//============================================================================= -StatusCode TupleToolMuonIDCalib::fillVars( const LHCb::Particle* part, const std::string prefix, Tuples::Tuple& tuple, - IGeometryInfo const& geometry ) { - - if ( ( !part->isBasicParticle() ) || NULL == part->proto() ) { - error() << "!! Tried to fill MuonIDCalib quantities for particle " << part->particleID().pid() - << "!!! This should not happen" << endmsg; - return StatusCode::SUCCESS; - } - - const LHCb::Track* track = part->proto()->track(); - if ( ( track->checkFlag( LHCb::Track::Flags::Clone ) ) || - !( track->checkType( LHCb::Track::Types::Long ) || track->checkType( LHCb::Track::Types::Downstream ) || - track->checkType( LHCb::Track::Types::Ttrack ) ) ) { - return StatusCode::SUCCESS; - } - - ///------------------------------------------------------------------------------------- - // 6 March 2012, Add the muon detector hit positions related to the track, to the ntuple - // one has to get the muon part of the track (from muonPIDs)and then get the lhcbIDs related to it - ///------------------------------------------------------------------------------------- - - if ( m_doVerbose ) { - - std::vector m_x; - std::vector m_y; - std::vector m_z; - - LHCb::MuonPIDs* pMuids = NULL; - if ( exist( LHCb::MuonPIDLocation::Default ) ) - pMuids = get( LHCb::MuonPIDLocation::Default ); - - if ( !pMuids ) { - error() << " Failed to get pMuids" << LHCb::MuonPIDLocation::Default << endmsg; - return StatusCode::FAILURE; - } - if ( msgLevel( MSG::DEBUG ) ) debug() << " >> number of Mu tracks in the event " << pMuids->size() << endmsg; - const LHCb::Track* mutrack = NULL; - LHCb::MuonPIDs::const_iterator ip; - for ( ip = pMuids->begin(); ip != pMuids->end(); ip++ ) { - if ( ( *ip )->idTrack() == track ) { - mutrack = ( *ip )->muonTrack(); - if ( !mutrack ) continue; - debug() << "found a mutrack " << endmsg; - } - } // end of muonIDs loop - if ( msgLevel( MSG::DEBUG ) ) debug() << "Fatima, I out of mutrack loop" << endmsg; - - if ( mutrack ) { - const std::vector lhcbIDs = mutrack->lhcbIDs(); - if ( msgLevel( MSG::DEBUG ) ) - debug() << " Starting to find the muon hit info, have " << lhcbIDs.size() << " to loop over " << endmsg; - - int countVelo( 0 ), countIT( 0 ), countOT( 0 ), countTT( 0 ), countMuon( 0 ), countCALO( 0 ), countRICH( 0 ); - std::vector::const_iterator myID = lhcbIDs.begin(); - for ( ; myID != lhcbIDs.end(); myID++ ) { - if ( ( ( *myID ).isVelo() ) ) countVelo++; - if ( ( ( *myID ).isIT() ) ) countIT++; - if ( ( ( *myID ).isOT() ) ) countOT++; - if ( ( ( *myID ).isTT() ) ) countTT++; - if ( ( ( *myID ).isCalo() ) ) countCALO++; - if ( ( ( *myID ).isRich() ) ) countRICH++; - - if ( ( ( *myID ).isMuon() ) ) { - countMuon++; - const LHCb::MuonTileID mutile = ( *myID ).muonID(); - double x, dx, y, dy, z, dz; - StatusCode sc = m_mudet->Tile2XYZ( mutile, x, dx, y, dy, z, dz ); - if ( msgLevel( MSG::DEBUG ) ) - debug() << "Muon pad hit: " << x << " " << dx << " " << y << " " << dy << " " << z << " " << dz - << ". Stn: " << mutile.station() << " regn: " << mutile.region() << " qrtr: " << mutile.quarter() - << " nX and nY " << mutile.nX() << " " << mutile.nY() << endmsg; - if ( sc.isSuccess() ) { - m_x.push_back( x ); - m_y.push_back( y ); - m_z.push_back( z ); - } else { - warning() << "m_mudet->Tile2XYZ() failed for mutile = " << mutile << endmsg; - } - } - } - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "track history is " << track->checkHistory( LHCb::Track::History::MuonID ) << endmsg; - debug() << "=============== velo " << countVelo << " IT " << countIT << " OT " << countOT << " TT " << countTT - << " calo " << countCALO << " rich " << countRICH << " muon " << countMuon << endmsg; - } - } - - else { - if ( msgLevel( MSG::DEBUG ) ) debug() << "While trying to get lhcbIDs, I didn't find a mutrack! " << endmsg; - } - - tuple->farray( prefix + "_LHCbID_X", m_x.begin(), m_x.end(), prefix + "_n", 100 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_LHCbID_Y", m_y.begin(), m_y.end(), prefix + "_n", 100 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_LHCbID_Z", m_z.begin(), m_z.end(), prefix + "_n", 100 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - - } // m_doVerbose - - ///------------------------------------------------------------------------------- - /// Project the state at M1 into the rest of the muon stations and store the x, y - ///------------------------------------------------------------------------------- - - m_stateP = &( track->closestState( m_stationZ[0] ) ); - - for ( int station = 0; station < m_NStation; station++ ) { - - m_trackX[station] = m_stateP->x() + ( m_stateP->tx() * ( m_stationZ[station] - m_stateP->z() ) ); - m_trackY[station] = m_stateP->y() + ( m_stateP->ty() * ( m_stationZ[station] - m_stateP->z() ) ); - if ( msgLevel( MSG::DEBUG ) ) - debug() << "Station: " << station << ". " - << "m_trackX[station] " << m_trackX[station] << " = " << m_stateP->x() << " + " - << " (" << m_stateP->tx() << " * (" << m_stationZ[station] << " - " << m_stateP->z() << " ) )" << endmsg; - } // station - - // extrapolation through the stations to get expected positions with - // errors due to multiple scattering - - bool ecode = estrapola( geometry ); - if ( !ecode ) debug() << "estrapola: track extrapolation failed " << endmsg; - - bool test = true; - for ( int station = 0; station < m_NStation; station++ ) { - std::stringstream ss; - ss << station + 1; - test &= tuple->column( prefix + "_Xs" + ss.str(), m_trackX[station] ); - test &= tuple->column( prefix + "_Ys" + ss.str(), m_trackY[station] ); - - test &= tuple->column( prefix + "_extraXs" + ss.str(), m_TextraX[station] ); - test &= tuple->column( prefix + "_extraYs" + ss.str(), m_TextraY[station] ); - test &= tuple->column( prefix + "_ms2Xs" + ss.str(), m_ms2X[station] ); - test &= tuple->column( prefix + "_ms2Ys" + ss.str(), m_ms2Y[station] ); - test &= tuple->column( prefix + "_TRegs" + ss.str(), m_TextraReg[station] ); - } - - // ====================================== - // Calculate and fill DistAve and Xs, Ys - // ====================================== - - double m_momentum = m_stateP->p(); - int nHits = 0; - int ic_hit = 0; - // int ic_closesthit = 0; - float dist_ave = 0; - std::vector small_dist( m_NStation ); - - for ( int i = 0; i < m_NStation; ++i ) { - small_dist[i] = 100000000.; - m_smalldist_X[i] = 100000000.; - m_smalldist_Y[i] = 100000000.; - m_smalldist_Z[i] = 100000000.; - m_smalldist_dX[i] = 0.; - m_smalldist_dY[i] = 0.; - m_smalldist_dZ[i] = 0.; - } - - // store hit info if its in the FOI of the track - - for ( int station = 0; station < m_NStation; station++ ) { - - for ( int region = 0; region < m_NRegion; region++ ) { - - if ( !m_coordPos[station * m_NRegion + region].empty() ) { - - std::vector::const_iterator itPos; - - for ( itPos = m_coordPos[station * m_NRegion + region].begin(); - itPos != m_coordPos[station * m_NRegion + region].end(); itPos++ ) { - - // all muon hits - if ( m_doVerbose ) { - m_allMuonHitsX.push_back( itPos->m_x ); - m_allMuonHitsDX.push_back( itPos->m_dx ); - m_allMuonHitsY.push_back( itPos->m_y ); - m_allMuonHitsDY.push_back( itPos->m_dy ); - m_allMuonHitsZ.push_back( itPos->m_z ); - m_allMuonHitsDZ.push_back( itPos->m_dz ); - m_allMuonHitsUncrossed.push_back( itPos->m_uncrossed ); - m_allMuonHitsID.push_back( station * m_NRegion + region ); - m_allMuonHitsTDC1.push_back( itPos->m_digitTDC1 ); - m_allMuonHitsTDC2.push_back( itPos->m_digitTDC2 ); - } - - // hits in foi - double x = itPos->m_x; - double dx = itPos->m_dx; - double y = itPos->m_y; - double dy = itPos->m_dy; - - if ( msgLevel( MSG::VERBOSE ) ) - verbose() << "Computing DistAve: x, dx, y, dy are " << x << " " << dx << " " << y << " " << dy - << endmsg; - - double xdist = fabs( x - m_trackX[station] ) / dx; - double ydist = fabs( y - m_trackY[station] ) / dy; - double dist = std::sqrt( xdist * xdist + ydist * ydist ); - - if ( msgLevel( MSG::VERBOSE ) ) - verbose() << "xdist, ydist and dist are " << xdist << " " << ydist << " " << dist << endmsg; - - // Look for the Closest hit to the track in any station: - if ( dist < small_dist[station] ) { - small_dist[station] = dist; - m_smalldist_X[station] = itPos->m_x; - m_smalldist_Y[station] = itPos->m_y; - m_smalldist_Z[station] = itPos->m_z; - m_smalldist_dX[station] = itPos->m_dx; - m_smalldist_dY[station] = itPos->m_dy; - m_smalldist_dZ[station] = itPos->m_dz; - // ic_closesthit = ic_hit; - } - - // define the FOI in which we have to evaluate the average - double foiXDim = m_NFoi * foiX( station, region, m_momentum, dx ); - double foiYDim = m_NFoi * foiY( station, region, m_momentum, dy ); - - if ( msgLevel( MSG::VERBOSE ) ) - verbose() << "Checking for FOI: " << m_NFoi << " " << station << " " << region << " " << m_momentum << " " - << dx << endmsg; - - // check if the hit is in the window - if ( ( fabs( x - m_trackX[station] ) < foiXDim ) && ( fabs( y - m_trackY[station] ) < foiYDim ) ) { - ++nHits; - dist_ave = dist_ave + ( xdist * xdist + ydist * ydist ); - - if ( m_doVerbose ) { - m_hitInFOIx.push_back( x ); - m_hitInFOIdx.push_back( dx ); - m_hitInFOIy.push_back( y ); - m_hitInFOIdy.push_back( dy ); - m_hitInFOIz.push_back( itPos->m_z ); - m_hitInFOIdz.push_back( itPos->m_dz ); - m_hitInFOIuncrossed.push_back( itPos->m_uncrossed ); - m_hitInFOIID.push_back( station * m_NRegion + region ); - m_hitInFOITDC1.push_back( itPos->m_digitTDC1 ); - m_hitInFOITDC2.push_back( itPos->m_digitTDC2 ); - m_hitInFOIID.push_back( station * m_NRegion + region ); - } - } - - ++ic_hit; - } // for itPos - - } // region not empty - - } // region - - } // station - - if ( m_doVerbose ) { - tuple->farray( prefix + "_hitInFOI_X", m_hitInFOIx.begin(), m_hitInFOIx.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_dX", m_hitInFOIdx.begin(), m_hitInFOIdx.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_Y", m_hitInFOIy.begin(), m_hitInFOIy.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_dY", m_hitInFOIdy.begin(), m_hitInFOIdy.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_Z", m_hitInFOIz.begin(), m_hitInFOIz.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_dZ", m_hitInFOIdz.begin(), m_hitInFOIdz.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_ID", m_hitInFOIID.begin(), m_hitInFOIID.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_hitInFOI_uncrossed", m_hitInFOIuncrossed.begin(), m_hitInFOIuncrossed.end(), - prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_TDC1", m_hitInFOITDC1.begin(), m_hitInFOITDC1.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple->farray( prefix + "_hitInFOI_TDC2", m_hitInFOITDC2.begin(), m_hitInFOITDC2.end(), prefix + "_n_InFOI", 500 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - if ( prefix == "lab2" ) { - tuple - ->farray( prefix + "_allMuonHits_X", m_allMuonHitsX.begin(), m_allMuonHitsX.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_dX", m_allMuonHitsDX.begin(), m_allMuonHitsDX.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_Y", m_allMuonHitsY.begin(), m_allMuonHitsY.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_dY", m_allMuonHitsDY.begin(), m_allMuonHitsDY.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_Z", m_allMuonHitsZ.begin(), m_allMuonHitsZ.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_dZ", m_allMuonHitsDZ.begin(), m_allMuonHitsDZ.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_ID", m_allMuonHitsID.begin(), m_allMuonHitsID.end(), prefix + "_n_AllHits", - 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_uncrossed", m_allMuonHitsUncrossed.begin(), m_allMuonHitsUncrossed.end(), - prefix + "_n_AllHits", 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_TDC1", m_allMuonHitsTDC1.begin(), m_allMuonHitsTDC1.end(), - prefix + "_n_AllHits", 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( prefix + "_allMuonHits_TDC2", m_allMuonHitsTDC2.begin(), m_allMuonHitsTDC2.end(), - prefix + "_n_AllHits", 10000 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - } - - for ( int station = 0; station < m_NStation; ++station ) { - std::stringstream ss; - ss << station + 1; - const std::string& mychar2 = ss.str(); - test &= tuple->column( prefix + "Stn" + mychar2 + "X", m_smalldist_X[station] ); - test &= tuple->column( prefix + "Stn" + mychar2 + "Y", m_smalldist_Y[station] ); - test &= tuple->column( prefix + "Stn" + mychar2 + "Z", m_smalldist_Z[station] ); - } - } - - if ( m_estimate ) { - // estimate the momentum of the muon-track assuming it cames from the primary vertex - // first --> do a linear fit with the closest hits in FOI, starting from M1 to M5, - // if successful call the tool to estimate the momentum - // - m_5pZM1 = 0.; - m_5qOverP = 0.; - m_5sigmaQOverP2 = 0.; - m_5pXPvtx = 0.; - m_5pYPvtx = 0.; - m_5pZPvtx = 0.; - - int FromM1 = 1; - bool fcode = linFit( FromM1 ); - if ( !fcode ) { - debug() << "linFit: linear fit closest hits in FOI failed " << endmsg; - } else { - bool pcode = calculatePt( FromM1 ); - if ( !pcode ) debug() << "calculatePt: calculation momentum of muon track failed From M1" << endmsg; - } - test &= tuple->column( prefix + "_5pZM1", m_5pZM1 ); - test &= tuple->column( prefix + "_5qOverP", m_5qOverP ); - test &= tuple->column( prefix + "_5sigmaQOverP2", m_5sigmaQOverP2 ); - test &= tuple->column( prefix + "_5pXvtx", m_5pXPvtx ); - test &= tuple->column( prefix + "_5pYvtx", m_5pYPvtx ); - test &= tuple->column( prefix + "_5pZvtx", m_5pZPvtx ); - - // estimate the momentum of the muon-track assuming it cames from the primary vertex - // first --> do a linear fit with the closest hits in FOI, starting from M2 to M5, - // if successful call the tool to estimate the momentum - // - m_4pZM1 = 0.; - m_4qOverP = 0.; - m_4sigmaQOverP2 = 0.; - m_4pXPvtx = 0.; - m_4pYPvtx = 0.; - m_4pZPvtx = 0.; - - int FromM1_2 = 0; - bool fcode_2 = linFit( FromM1_2 ); - if ( !fcode_2 ) { - debug() << "linFit: linear fit closest hits in FOI failed " << endmsg; - } else { - bool pcode_2 = calculatePt( FromM1_2 ); - if ( !pcode_2 ) debug() << "calculatePt: calculation momentum of muon track failed From M2" << endmsg; - } - test &= tuple->column( prefix + "_4pZM1", m_4pZM1 ); - test &= tuple->column( prefix + "_4qOverP", m_4qOverP ); - test &= tuple->column( prefix + "_4sigmaQOverP2", m_4sigmaQOverP2 ); - test &= tuple->column( prefix + "_4pXvtx", m_4pXPvtx ); - test &= tuple->column( prefix + "_4pYvtx", m_4pYPvtx ); - test &= tuple->column( prefix + "_4pZvtx", m_4pZPvtx ); - } - - if ( nHits > 0 ) { dist_ave = dist_ave / nHits; } - - if ( msgLevel( MSG::VERBOSE ) ) - verbose() << " So the dist_ave for track " << track->key() << " (" << track->charge() - << ") will be: " << dist_ave << endmsg; - - test &= tuple->column( prefix + "_DistAve", dist_ave ); - return test ? StatusCode::SUCCESS : StatusCode::FAILURE; - -} // fillVars - -/// track fitting with linear Chi^2 from M1/M2 to M5 -bool TupleToolMuonIDCalib::linFit( int& FromM1 ) { - - m_sx = m_sy = 0.; - m_bx = m_by = 0.; - m_errbx = m_errsx = m_covbsx = 0.; - m_errby = m_errsy = m_covbsy = 0.; - m_chi2x = m_chi2y = 0.; - - int StartI = 0; // fit from M1 to M5 - if ( FromM1 == 0 ) StartI = 1; // fit from M2 to M5 - - int nPunti = 0; - for ( int i = StartI; i < m_NStation; ++i ) { - if ( m_smalldist_X[i] == 0.0 ) continue; - nPunti++; - } - - double dof = nPunti - 2.; - if ( dof == 0. ) return false; - - double xc11, xc12, xc22, xv1, xv2, xxx; - xc11 = xc12 = xc22 = xv1 = xv2 = xxx = 0.; - double yc11, yc12, yc22, yv1, yv2, yyy; - yc11 = yc12 = yc22 = yv1 = yv2 = yyy = 0.; - double xdet, ydet; - xdet = ydet = 0.; - double xerr, yerr; - xerr = yerr = 0.; - - for ( int i = StartI; i < m_NStation; ++i ) { - - if ( m_smalldist_dX[i] == 0.0 ) continue; - double x, dx, y, dy, z; // dz; - - x = m_smalldist_X[i]; - y = m_smalldist_Y[i]; - z = m_smalldist_Z[i]; - dx = m_smalldist_dX[i]; - dy = m_smalldist_dY[i]; - // dz = m_smalldist_dZ[i]; - - xerr = 2. * dx; - yerr = 2. * dy; - - // then fit them with a min chi^2 in the 2 projections xz and yz - // 1) XZ projection: - xc11 += z * z / xerr / xerr; - xc12 += z / xerr / xerr; - xc22 += 1.0 / xerr / xerr; - xv1 += z * x / xerr / xerr; - xv2 += x / xerr / xerr; - xxx += x * x / xerr / xerr; - - // 2) YZ projection: - yc11 += z * z / yerr / yerr; - yc12 += z / yerr / yerr; - yc22 += 1.0 / yerr / yerr; - yv1 += z * y / yerr / yerr; - yv2 += y / yerr / yerr; - yyy += y * y / yerr / yerr; - } - - if ( ( xdet = xc11 * xc22 - xc12 * xc12 ) == 0 ) return false; - if ( ( ydet = yc11 * yc22 - yc12 * yc12 ) == 0 ) return false; - m_sx = ( xv1 * xc22 - xv2 * xc12 ) / xdet; - m_sy = ( yv1 * yc22 - yv2 * yc12 ) / ydet; - m_bx = ( xv2 * xc11 - xv1 * xc12 ) / xdet; - m_by = ( yv2 * yc11 - yv1 * yc12 ) / ydet; - - m_errbx = sqrt( xc11 / xdet ); - m_errsx = sqrt( xc22 / xdet ); - m_covbsx = -xc12 / xdet; - - m_errby = sqrt( yc11 / ydet ); - m_errsy = sqrt( yc22 / ydet ); - m_covbsy = -yc12 / ydet; - - m_chi2x = - ( xxx + m_sx * m_sx * xc11 + m_bx * m_bx * xc22 - 2. * m_sx * xv1 - 2. * m_bx * xv2 + 2 * m_sx * m_bx * xc12 ) / - dof; - m_chi2y = - ( yyy + m_sy * m_sy * yc11 + m_by * m_by * yc22 - 2. * m_sy * yv1 - 2. * m_by * yv2 + 2 * m_sy * m_by * yc12 ) / - dof; - - return true; -} - -//============================================================================= -// Determination of the field polarity -//============================================================================= -StatusCode TupleToolMuonIDCalib::FindFieldPolarity() { - // compute fiels polarity - // we will use this value for all tracks - - double Zfirst = m_stationZ[0]; // M1 - - Gaudi::XYZPoint begin( 0., 0., 0. ); - Gaudi::XYZPoint end( 0., 0., Zfirst ); - Gaudi::XYZVector bdl; - double z; - - StatusCode sc = m_bIntegrator->calculateBdlAndCenter( begin, end, 0., 0., z, bdl ); - if ( sc.isFailure() ) { return Error( "Failed to find field centre !", StatusCode::FAILURE ); } - - if ( bdl.x() > 0.0 ) { - m_FieldPolarity = 1; - } else { - m_FieldPolarity = -1; - } - - debug() << "Integrated B field is " << bdl.x() << " Tm" - << " centered at Z=" << z / Gaudi::Units::m << " m" << endmsg; - - return StatusCode::SUCCESS; -} - -//==================================================================================== -/// estimate the momentum of the muon-track assuming it cames from the primary vertex -//==================================================================================== -bool TupleToolMuonIDCalib::calculatePt( int& FromM1 ) { - - double pZM1 = 0.; - double qOverP = 0.; - double sigmaQOverP2 = 0.; - double pXPvtx = 0.; - double pYPvtx = 0.; - double pZPvtx = 0.; - - double Zfirst = m_stationZ[0]; // M1 - if ( FromM1 == 0 ) Zfirst = m_stationZ[1]; // M2 - - Gaudi::XYZPoint trackPos( m_bx + m_sx * Zfirst, m_by + m_sy * Zfirst, Zfirst ); - LHCb::State state( LHCb::StateVector( trackPos, Gaudi::XYZVector( m_sx, m_sy, 1.0 ), 1. / 10000. ) ); - - // - Gaudi::XYZPoint begin( 0., 0., 0. ); - Gaudi::XYZPoint end( state.x(), state.y(), state.z() ); - Gaudi::XYZVector bdl; - double zCenter; - - StatusCode sc = m_bIntegrator->calculateBdlAndCenter( begin, end, state.tx(), state.ty(), zCenter, bdl ); - if ( !sc ) { - error() << " Failed to integrate field !!" << endmsg; - return false; - } - - // copied from the TrackPtKick tool by M. Needham - double q = 0.; - double p = 1e6 * Gaudi::Units::MeV; - - double tX; - double xCenter; - double zeta_trk; - double tx_vtx; - double zeta_vtx; - double curv; - - if ( fabs( bdl.x() ) > TrackParameters::hiTolerance ) { - // can estimate momentum and charge - - // Rotate to the 0-0-z axis and do the ptkick - tX = state.tx(); - xCenter = state.x() + tX * ( zCenter - state.z() ); - - zeta_trk = -tX / sqrt( 1.0 + tX * tX ); - tx_vtx = xCenter / zCenter; - zeta_vtx = -tx_vtx / sqrt( 1.0 + tx_vtx * tx_vtx ); - - // curvature - curv = ( zeta_trk - zeta_vtx ); - - // charge - int sign = 1; - if ( curv < TrackParameters::hiTolerance ) { sign *= -1; } - if ( bdl.x() < TrackParameters::hiTolerance ) { sign *= -1; } - q = -1. * m_FieldPolarity * sign; - - // momentum - p = Gaudi::Units::eplus * Gaudi::Units::c_light * fabs( bdl.x() ) * - sqrt( ( 1.0 + tX * tX + gsl_pow_2( state.ty() ) ) / ( 1.0 + gsl_pow_2( tX ) ) ) / fabs( curv ); - - // Addition Correction factor for the angle of the track! - if ( m_ParabolicCorrection.size() == 2u ) { - // p*= (a + b*tx*tx ) - p += m_Constant; - p *= ( m_ParabolicCorrection[0] + ( m_ParabolicCorrection[1] * tX * tX ) ); - } - - } else { - // can't estimate momentum or charge - error() << "B integral is 0!" << endmsg; - return false; - } - - pZM1 = p; - qOverP = q / p; - const double err2 = gsl_pow_2( m_resParams[0] ) + gsl_pow_2( m_resParams[1] / p ); - sigmaQOverP2 = err2 * gsl_pow_2( 1.0 / p ); - - // set MuonTrack momentum variables (momentum at primary vertex) - if ( ( tx_vtx * tx_vtx + state.ty() * state.ty() ) > 1. ) { - // can't estimate momentum vector components - error() << "can't estimate px, py, pz " << endmsg; - return false; - } - double pz_vtx = p * sqrt( 1 - tx_vtx * tx_vtx - state.ty() * state.ty() ); - Gaudi::XYZVector momentum_vtx( tx_vtx * pz_vtx, state.ty() * pz_vtx, pz_vtx ); - pXPvtx = momentum_vtx.X(); - pYPvtx = momentum_vtx.Y(); - pZPvtx = momentum_vtx.Z(); - - if ( FromM1 == 1 ) { - m_5pZM1 = pZM1; - m_5qOverP = qOverP; - m_5sigmaQOverP2 = sigmaQOverP2; - m_5pXPvtx = pXPvtx; - m_5pYPvtx = pYPvtx; - m_5pZPvtx = pZPvtx; - } else if ( FromM1 == 0 ) { - m_4pZM1 = pZM1; - m_4qOverP = qOverP; - m_4sigmaQOverP2 = sigmaQOverP2; - m_4pXPvtx = pXPvtx; - m_4pYPvtx = pYPvtx; - m_4pZPvtx = pZPvtx; - } - - return true; -} - -// extrapolation through the stations to get expected positions with -// errors due to multiple scattering -bool TupleToolMuonIDCalib::estrapola( IGeometryInfo const& geometry ) { - - LHCb::State ExtraState = *( m_stateP ); - - for ( int station = 0; station < m_NStation; station++ ) { - - StatusCode sc = m_extrapolator->propagate( ExtraState, m_stationZ[station], geometry, LHCb::Tr::PID::Muon() ); - if ( sc.isFailure() ) { - debug() << " ==> Extrapolating to z = " << m_stationZ[station] << " failed " << endmsg; - return false; - } - - m_TextraX[station] = ExtraState.x(); - m_TextraY[station] = ExtraState.y(); - m_ms2X[station] = ExtraState.errX2(); - m_ms2Y[station] = ExtraState.errY2(); - - int region = 0; - while ( region < 3 ) { - if ( fabs( m_TextraX[station] ) < ( m_regionOuterX[station] / pow( 2., 3 - region ) ) && - fabs( m_TextraY[station] ) < ( m_regionOuterY[station] / pow( 2., 3 - region ) ) ) - break; - region++; - } - m_TextraReg[station] = region; - } - return true; -} diff --git a/Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonPid.cpp b/Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonPid.cpp deleted file mode 100644 index 0bebec6c..00000000 --- a/Phys/DecayTreeTupleMuonCalib/src/TupleToolMuonPid.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" - -#include "Kernel/IParticleTupleTool.h" // Interface -#include "Kernel/LHCbID.h" -#include "Kernel/MuonTileID.h" -#include "Kernel/Particle2MCLinker.h" - -#include "MuonDet/DeMuonDetector.h" -#include "MuonDet/MuonBasicGeometry.h" - -#include "Event/MuonCoord.h" -#include "Event/MuonDigit.h" -#include "Event/MuonPID.h" -#include "Event/Particle.h" -#include "Event/Track.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -/** - * @author Kazu Akiba - * @date 2011-09-01 - * 2007-11-07 : Jeremie Borel - */ -class TupleToolMuonPid : public TupleToolBase, virtual public IParticleTupleTool { -public: - TupleToolMuonPid( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - - StatusCode trackExtrapolate( const LHCb::Track* pTrack, std::vector& trackX, std::vector& trackY ); - std::vector findTrackRegions( const LHCb::Track* pTrack ); - -private: - DeMuonDetector* m_mudet; - unsigned int m_NStation; // Number of stations - unsigned int m_NRegion; // Number of regions - std::vector m_stationZ; // station position - std::vector m_trackX; // position of track in x(mm) in each station - std::vector m_trackY; // position of track in y(mm) in each station - - // Names of the station - std::vector m_stationNames; -}; - -using namespace LHCb; - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolMuonPid::TupleToolMuonPid( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); -} - -StatusCode TupleToolMuonPid::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - // Get Basic Muon geometry info - m_NStation = 0; - m_NRegion = 0; - MuonBasicGeometry basegeometry( detSvc(), msgSvc() ); - m_NStation = basegeometry.getStations(); - m_NRegion = basegeometry.getRegions(); - unsigned int i = 0; - while ( i < m_NStation ) { - m_stationNames.push_back( basegeometry.getStationName( i ) ); - if ( msgLevel( MSG::DEBUG ) ) debug() << " station " << i << " " << m_stationNames[i] << endmsg; - i++; - } - m_mudet = getDet( "/dd/Structure/LHCb/DownstreamRegion/Muon" ); - // m_mudet=getDet(DeMuonLocation::Default); - for ( unsigned int station = 0; station < m_NStation; station++ ) { - m_stationZ.push_back( m_mudet->getStationZ( station ) ); - } - if ( !m_mudet ) return StatusCode::FAILURE; - return sc; -} - -StatusCode TupleToolMuonPid::fill( const Particle*, const Particle* P, const std::string& head, Tuples::Tuple& tuple, - IGeometryInfo const& ) { - const std::string prefix = fullName( head ); - if ( msgLevel( MSG::DEBUG ) ) - debug() << "TupleToolMuonPid::fill: ++++++++ Filling info for particle with key " << P->key() << " head: " << head - << " ++++++++ " << endmsg; - if ( P ) { - bool test = true; - test &= tuple->column( prefix + "_ID", P->particleID().pid() ); - if ( !P->isBasicParticle() ) return StatusCode( test ); // no rich info for composite! - if ( isPureNeutralCalo( P ) ) return StatusCode( test ); // no rich information for calo neutrals - const ProtoParticle* proto = P->proto(); - if ( proto ) { - // Combined DLLs - test &= - tuple->column( prefix + "_CombDLLMu", proto->info( LHCb::ProtoParticle::additionalInfo::CombDLLmu, -1000 ) ); - test &= - tuple->column( prefix + "_ProbNNmu", proto->info( LHCb::ProtoParticle::additionalInfo::ProbNNmu, -1000 ) ); - test &= tuple->column( prefix + "_ProbNNghost", - proto->info( LHCb::ProtoParticle::additionalInfo::ProbNNghost, -1000 ) ); - test &= - tuple->column( prefix + "_InMuonAcc", proto->info( LHCb::ProtoParticle::additionalInfo::InAccMuon, -1000 ) ); - bool hasMuon = false; - bool isMuon = false; - bool isMuonLoose = false; - // bool isMuonTight = false; - double muonLLmu = -99999; - double muonLLbg = -99999; - const MuonPID* muonPID = proto->muonPID(); - int NShared = -1; - double muonDist2 = -99999; - if ( muonPID ) { - hasMuon = true; - isMuon = muonPID->IsMuon(); - isMuonLoose = muonPID->IsMuonLoose(); - // isMuonTight = muonPID->IsMuonTight(); - NShared = muonPID->nShared(); - muonLLmu = muonPID->MuonLLMu(); - muonLLbg = muonPID->MuonLLBg(); - // std::cout << "before get Tracks" << std::endl; - const LHCb::Track* track = muonPID->muonTrack(); - if ( track ) { - // std::cout << "before get muonDist2" << std::endl; - muonDist2 = track->info( LHCb::Track::AdditionalInfo::MuonDist2, -1000 ); - } - } - - // Find region in M2 or M3 from track extrapolation, used to calculate muLL - const LHCb::Track* pTrack = proto->track(); - std::vector trackRegion( m_NStation, -1 ); - - // find track region - trackRegion = findTrackRegions( pTrack ); - int region = trackRegion[1]; // M2 - if ( region < 0 ) { - if ( msgLevel( MSG::DEBUG ) ) - debug() << " Track extrapolation in station 2 gives non-existent region " << endmsg; - region = trackRegion[2]; // M3 - } - if ( region < 0 && msgLevel( MSG::DEBUG ) ) - debug() << " Track extrapolation in station 3 gives non-existent region " << endmsg; - - if ( msgLevel( MSG::DEBUG ) ) - debug() << "TupleToolMuonPid::fill:Track info: p = " << pTrack->p() << " Region in M2/M3: " << region - << " IsMuonLoose = " << isMuonLoose << " IsMuon = " << isMuon << " Dist2 = " << muonDist2 - << " muonLLmu = " << muonLLmu << " muonLLbg = " << muonLLbg << endmsg; - - // std::cout << "before add MuonDist2 to ntuple" << std::endl; - test &= tuple->column( prefix + "_MuonDist2", muonDist2 ); - test &= tuple->column( prefix + "_regionInM2", region ); - int isMuonFromProto = -2000; - test &= tuple->column( prefix + "_hasMuon", hasMuon ); - test &= tuple->column( prefix + "_isMuon", isMuon ); - test &= tuple->column( prefix + "_isMuonLoose", isMuonLoose ); - // test &= tuple->column( prefix+"_isMuonTight", isMuonTight); - test &= tuple->column( prefix + "_NShared", NShared ); - test &= tuple->column( prefix + "_MuonLLmu", muonLLmu ); - test &= tuple->column( prefix + "_MuonLLbg", muonLLbg ); - - isMuonFromProto = ( (int)( proto->info( LHCb::ProtoParticle::additionalInfo::MuonPIDStatus, -999 ) ) ) % 2; - test &= tuple->column( prefix + "_isMuonFromProto", isMuonFromProto ); - - // const LHCb::Track* track = proto->track(); - // if (track) { - // test &= tuple->column( prefix+"_MuonDist2", track->info(LHCb::Track::AdditionalInfo::MuonDist2, -1000)); - //} - - return StatusCode( test ); - } - } - return StatusCode::FAILURE; -} - -//===================================================================== -// Extrapolate track to Muon system and find region in each chamber. Region in M2 is used in the dll calculation -// Code copied/adapted from MuonIDAlg. J. Helder. 04/2013 -//===================================================================== - -StatusCode TupleToolMuonPid::trackExtrapolate( const LHCb::Track* pTrack, std::vector& trackX, - std::vector& trackY ) { - - // get first state for the preSel cut - const LHCb::State* state1 = &( pTrack->firstState() ); - // get state closest to M1 for extrapolation - const LHCb::State* state = &( pTrack->closestState( 9450. ) ); - - if ( !state1 ) return Error( " Failed to get 1st state from track " ); - if ( !state ) return Error( " Failed to get state from track " ); - - // get the momentum (MeV/c) - // double momentum = state->p(); - // double momentumPre = state1->p(); - // if (msgLevel(MSG::DEBUG)) debug() << "trackExtrapolate: momentum = " << momentum << " momentumPre = " << - // momentumPre << endmsg; - - // Project the state into the muon stations - for ( unsigned int station = 0; station < m_NStation; station++ ) { - // x(z') = x(z) + (dx/dz * (z' - z)) - trackX.push_back( state->x() + ( state->tx() * ( m_stationZ[station] - state->z() ) ) ); - trackY.push_back( state->y() + ( state->ty() * ( m_stationZ[station] - state->z() ) ) ); - } - if ( msgLevel( MSG::DEBUG ) ) { - debug() << "trackExtrapolate: trackX = " << trackX << endmsg; - debug() << "trackExtrapolate: trackY = " << trackY << endmsg; - } - return StatusCode::SUCCESS; -} - -//===================================================================== -std::vector TupleToolMuonPid::findTrackRegions( const LHCb::Track* pTrack ) { - //===================================================================== - // comment: Returns the muon detector region of the extrapolated track; - // authors: G. Lanfranchi & S. Furcas & X. Cid Vidal, - // date: 10/3/11 - //===================================================================== - - std::vector trackX; - std::vector trackY; - trackExtrapolate( pTrack, trackX, trackY ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - - // info() << "findTrackRegions: trackX = " << trackX << endmsg; - // info() << "findTrackRegions: trackY = " << trackY << endmsg; - - std::vector trackRegion( m_NStation, -1 ); - // Region of the track extrapolated: - - for ( unsigned int sta = 0; sta < m_NStation; sta++ ) { - - int chnum = -1; - int regnum = -1; - - m_mudet->Pos2StChamberNumber( trackX[sta], trackY[sta], sta, chnum, regnum ).ignore(); - // if (msgLevel(MSG::DEBUG)) debug() << "TupleToolMuonPid: Station = " << sta << " chnum = " << chnum << " regnum = - // " << regnum << endmsg; - trackRegion[sta] = regnum; - if ( trackRegion[sta] < 0 && msgLevel( MSG::DEBUG ) ) - debug() << format( " Track extrapolation in station %d gives not-existent region ", sta ) << endmsg; - } - - if ( msgLevel( MSG::DEBUG ) ) debug() << "TrackRegions: " << trackRegion << endmsg; - return trackRegion; -} - -// Declaration of the Tool Factory -// actually acts as a using namespace TupleTool -DECLARE_COMPONENT( TupleToolMuonPid ) -- GitLab From 9a409c5d65d0de4e005ad8d2ddd9ad3e62857946 Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Mon, 4 Oct 2021 17:16:36 +0200 Subject: [PATCH 56/82] Remove Phys/DecayTreeTupleANNPID --- CMakeLists.txt | 1 - Phys/DecayTreeTupleANNPID/CMakeLists.txt | 24 --- Phys/DecayTreeTupleANNPID/doc/release.notes | 29 ---- .../src/TupleToolANNPID.cpp | 144 ------------------ .../src/TupleToolANNPIDTraining.cpp | 56 ------- .../src/component/DecayTreeTuple.cpp | 1 - 6 files changed, 255 deletions(-) delete mode 100644 Phys/DecayTreeTupleANNPID/CMakeLists.txt delete mode 100644 Phys/DecayTreeTupleANNPID/doc/release.notes delete mode 100644 Phys/DecayTreeTupleANNPID/src/TupleToolANNPID.cpp delete mode 100644 Phys/DecayTreeTupleANNPID/src/TupleToolANNPIDTraining.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6134869e..4bd55f9e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,6 @@ lhcb_add_subdirectories( Phys/DaVinciTrackRefitting Phys/DaVinciTrackScaling Phys/DecayTreeTuple - Phys/DecayTreeTupleANNPID Phys/DecayTreeTupleBase Phys/DecayTreeTupleJets Phys/DecayTreeTupleMC diff --git a/Phys/DecayTreeTupleANNPID/CMakeLists.txt b/Phys/DecayTreeTupleANNPID/CMakeLists.txt deleted file mode 100644 index 1868de9e..00000000 --- a/Phys/DecayTreeTupleANNPID/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -############################################################################### -# (c) Copyright 2000-2021 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. # -############################################################################### -#[=======================================================================[.rst: -Phys/DecayTreeTupleANNPID -------------------------- -#]=======================================================================] - -gaudi_add_module(DecayTreeTupleANNPID - SOURCES - src/TupleToolANNPID.cpp - src/TupleToolANNPIDTraining.cpp - LINK - Analysis::DecayTreeTupleBaseLib - Phys::DaVinciInterfacesLib - Rec::RecInterfacesLib -) diff --git a/Phys/DecayTreeTupleANNPID/doc/release.notes b/Phys/DecayTreeTupleANNPID/doc/release.notes deleted file mode 100644 index 3edd1bd3..00000000 --- a/Phys/DecayTreeTupleANNPID/doc/release.notes +++ /dev/null @@ -1,29 +0,0 @@ -!----------------------------------------------------------------------------- -! Package : Phys/DecayTreeTupleANNPID -! Responsible : Chris Jones -! Purpose : ANNPID training tuple tools. -!----------------------------------------------------------------------------- - -!============ DecayTreeTupleANNPID v2r0 2016-03-22 ================= - -! 2016-02-23 - Chris Jones - - Add "MC12TuneV4" and "MC15TuneV1" to the default list of ANNPID tunes. - -!========================= DecayTreeTupleANNPID v1r2 2014-12-15 ========================= -! 2014-12-02 - Chris Jones - - Add some Bs2MuMu tunings for testing (disabled by default). - -! 2014-12-02 - Chris Jones - - Add support for missing ANNPID networks, for instance when a tune only - provides one mass hypothesis (e.g. Bs2MuMu). - -!========================= DecayTreeTupleANNPID v1r1 2014-07-25 ========================= - -! 2014-06-27 - Chris Jones - - Add a new TupleTool that fills the ANNPID variables for a given list - of MVA tunes. - -!========================= DecayTreeTupleANNPID v1r0 2014-04-02 ========================= - -! 2014-04-01 - Chris Jones - - First version. Provides a tuple tool for the ANNPID training. diff --git a/Phys/DecayTreeTupleANNPID/src/TupleToolANNPID.cpp b/Phys/DecayTreeTupleANNPID/src/TupleToolANNPID.cpp deleted file mode 100644 index ef535bc2..00000000 --- a/Phys/DecayTreeTupleANNPID/src/TupleToolANNPID.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" -#include "RecInterfaces/IChargedProtoANNPIDTool.h" - -#include -#include - -class TupleToolANNPID : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolANNPID( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - // Local PID type enum - enum PID { El = 0, Mu, Pi, Ka, Pr, De, Gh }; - // total PID types possible - static const std::size_t NPIDs = 7; - - /// Activation flag for each type - std::array m_pidIsOn; - - /// Pointer to the ANNPID tool - const ANNGlobalPID::IChargedProtoANNPIDTool* m_pidTool = nullptr; - - /// The ANNPID tunes to fill - std::vector m_pidTunes; - - /// The PID types to fill - std::vector m_pidTypes; -}; - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolANNPID::TupleToolANNPID( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); - declareProperty( "ANNPIDTunes", m_pidTunes = {"MCUpTuneV1"} ); - // PID types. Deuteron by default is not included at the moment. - declareProperty( "PIDTypes", m_pidTypes = {"Electron", "Muon", "Pion", "Kaon", "Proton", "Ghost"} ); -} - -StatusCode TupleToolANNPID::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - m_pidTool = - tool( "ANNGlobalPID::ChargedProtoANNPIDTool", "ChargedProtoANNPID" ); - - // by default all types are off - m_pidIsOn.fill( false ); - // turn on as required - for ( const auto& p : m_pidTypes ) { - if ( "Electron" == p ) { - m_pidIsOn[El] = true; - } else if ( "Muon" == p ) { - m_pidIsOn[Mu] = true; - } else if ( "Pion" == p ) { - m_pidIsOn[Pi] = true; - } else if ( "Kaon" == p ) { - m_pidIsOn[Ka] = true; - } else if ( "Proton" == p ) { - m_pidIsOn[Pr] = true; - } else if ( "Deuteron" == p ) { - m_pidIsOn[De] = true; - } else if ( "Ghost" == p ) { - m_pidIsOn[Gh] = true; - } - } - - return sc; -} - -StatusCode TupleToolANNPID::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - StatusCode sc = StatusCode::SUCCESS; - - // Only run on charged stable particles - if ( !P || !P->proto() || !P->proto()->track() ) return sc; - - // get the prefix - const auto prefix = fullName( head ); - - // Loop over PID tunes - for ( const auto& pidTune : m_pidTunes ) { - // Fill the ANNPID variables for those that are defined - ANNGlobalPID::IChargedProtoANNPIDTool::RetType res; - // Electrons - if ( sc && m_pidIsOn[El] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 11 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNe", res.value ); } - } - // Muons - if ( sc && m_pidIsOn[Mu] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 13 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNmu", res.value ); } - } - // Pions - if ( sc && m_pidIsOn[Pi] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 211 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNpi", res.value ); } - } - // Kaons - if ( sc && m_pidIsOn[Ka] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 321 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNk", res.value ); } - } - // Protons - if ( sc && m_pidIsOn[Pr] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 2212 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNp", res.value ); } - } - // Deuterons - if ( sc && m_pidIsOn[De] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 1000010020 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNd", res.value ); } - } - // Ghosts - if ( sc && m_pidIsOn[Gh] ) { - res = m_pidTool->annPID( P->proto(), LHCb::ParticleID( 0 ), pidTune, geometry ); - if ( res.status ) { sc = tuple->column( prefix + "_" + pidTune + "_ProbNNghost", res.value ); } - } - } - - // return - return sc; -} - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolANNPID ) diff --git a/Phys/DecayTreeTupleANNPID/src/TupleToolANNPIDTraining.cpp b/Phys/DecayTreeTupleANNPID/src/TupleToolANNPIDTraining.cpp deleted file mode 100644 index 6be21bde..00000000 --- a/Phys/DecayTreeTupleANNPID/src/TupleToolANNPIDTraining.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IParticleTupleTool.h" -#include "RecInterfaces/IChargedProtoANNPIDTupleTool.h" - -class TupleToolANNPIDTraining : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolANNPIDTraining( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; ///< Initialise - -public: - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - /// Pointer to the ANNPID tuple tool - const ANNGlobalPID::IChargedProtoANNPIDTupleTool* m_tuple; -}; - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolANNPIDTraining ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolANNPIDTraining::TupleToolANNPIDTraining( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_tuple( NULL ) { - declareInterface( this ); -} - -StatusCode TupleToolANNPIDTraining::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - m_tuple = - tool( "ANNGlobalPID::ChargedProtoANNPIDTupleTool", "Tuple", this ); - return sc; -} - -StatusCode TupleToolANNPIDTraining::fill( const LHCb::Particle*, const LHCb::Particle* P, const std::string& /* head */, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - // Fill the ANNPID variables - // Note, prefix is not used here, so can only use this tool on a single particle at a time... - return m_tuple->fill( tuple, P, geometry ); -} diff --git a/Phys/DecayTreeTupleBase/src/component/DecayTreeTuple.cpp b/Phys/DecayTreeTupleBase/src/component/DecayTreeTuple.cpp index abb7f530..ce74cf75 100644 --- a/Phys/DecayTreeTupleBase/src/component/DecayTreeTuple.cpp +++ b/Phys/DecayTreeTupleBase/src/component/DecayTreeTuple.cpp @@ -100,7 +100,6 @@ DecayTreeTuple::DecayTreeTuple( const std::string& name, ISvcLocator* pSvcLocato // fill some default value m_toolList.push_back( "TupleToolKinematic" ); m_toolList.push_back( "TupleToolPid" ); - m_toolList.push_back( "TupleToolANNPID" ); m_toolList.push_back( "TupleToolGeometry" ); m_toolList.push_back( "TupleToolEventInfo" ); declareProperty( "ToolList", m_toolList ); -- GitLab From 4f8f8d64235bb6b37c6975a8021a56ddda647e61 Mon Sep 17 00:00:00 2001 From: Eduardo Rodrigues Date: Tue, 5 Oct 2021 17:16:40 +0200 Subject: [PATCH 57/82] Remove various unused tupletools from Phys/DecayTreeTuple --- Phys/DecayTreeTuple/CMakeLists.txt | 18 - .../DecayTreeTuple/src/TupleToolAllTracks.cpp | 781 ----------------- Phys/DecayTreeTuple/src/TupleToolAngles.cpp | 124 --- Phys/DecayTreeTuple/src/TupleToolBremInfo.cpp | 172 ---- .../src/TupleToolCaloDigits.cpp | 162 ---- Phys/DecayTreeTuple/src/TupleToolCaloDigits.h | 64 -- .../src/TupleToolCorrectedMass.cpp | 246 ------ Phys/DecayTreeTuple/src/TupleToolDira.cpp | 171 ---- Phys/DecayTreeTuple/src/TupleToolHOP.cpp | 531 ------------ .../src/TupleToolIsolationTwoBody.cpp | 794 ------------------ Phys/DecayTreeTuple/src/TupleToolMassHypo.cpp | 249 ------ .../src/TupleToolNeutrinoReco.cpp | 255 ------ .../src/TupleToolParticleReFit.cpp | 181 ---- .../src/TupleToolParticleStats.cpp | 62 -- .../src/TupleToolParticleStats.h | 42 - .../src/TupleToolPhotonInfo.cpp | 82 -- Phys/DecayTreeTuple/src/TupleToolPi0Info.cpp | 283 ------- .../src/TupleToolRadUpDownAsym.cpp | 213 ----- Phys/DecayTreeTuple/src/TupleToolSubMass.cpp | 471 ----------- Phys/DecayTreeTuple/src/TupleToolVeto.cpp | 122 --- .../src/TupleToolVtxDaughters.cpp | 438 ---------- 21 files changed, 5461 deletions(-) delete mode 100644 Phys/DecayTreeTuple/src/TupleToolAllTracks.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolAngles.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolBremInfo.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolCaloDigits.cpp delete mode 100755 Phys/DecayTreeTuple/src/TupleToolCaloDigits.h delete mode 100644 Phys/DecayTreeTuple/src/TupleToolCorrectedMass.cpp delete mode 100755 Phys/DecayTreeTuple/src/TupleToolDira.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolHOP.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolIsolationTwoBody.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolMassHypo.cpp delete mode 100755 Phys/DecayTreeTuple/src/TupleToolNeutrinoReco.cpp delete mode 100755 Phys/DecayTreeTuple/src/TupleToolParticleReFit.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolParticleStats.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolParticleStats.h delete mode 100755 Phys/DecayTreeTuple/src/TupleToolPhotonInfo.cpp delete mode 100755 Phys/DecayTreeTuple/src/TupleToolPi0Info.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolRadUpDownAsym.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolSubMass.cpp delete mode 100644 Phys/DecayTreeTuple/src/TupleToolVeto.cpp delete mode 100755 Phys/DecayTreeTuple/src/TupleToolVtxDaughters.cpp diff --git a/Phys/DecayTreeTuple/CMakeLists.txt b/Phys/DecayTreeTuple/CMakeLists.txt index 8e005390..2fb55759 100644 --- a/Phys/DecayTreeTuple/CMakeLists.txt +++ b/Phys/DecayTreeTuple/CMakeLists.txt @@ -15,31 +15,13 @@ Phys/DecayTreeTuple gaudi_add_module(DecayTreeTuple SOURCES - src/TupleToolAllTracks.cpp - src/TupleToolAngles.cpp src/TupleToolBeamSpot.cpp - src/TupleToolBremInfo.cpp - src/TupleToolCaloDigits.cpp - src/TupleToolCorrectedMass.cpp src/TupleToolDecayTreeFitter.cpp - src/TupleToolDira.cpp src/TupleToolGeometry.cpp - src/TupleToolHOP.cpp - src/TupleToolIsolationTwoBody.cpp src/TupleToolKinematic.cpp - src/TupleToolMassHypo.cpp - src/TupleToolNeutrinoReco.cpp - src/TupleToolParticleReFit.cpp - src/TupleToolParticleStats.cpp - src/TupleToolPhotonInfo.cpp - src/TupleToolPi0Info.cpp src/TupleToolPid.cpp src/TupleToolPropertime.cpp - src/TupleToolRadUpDownAsym.cpp - src/TupleToolSubMass.cpp src/TupleToolTagging.cpp - src/TupleToolVeto.cpp - src/TupleToolVtxDaughters.cpp src/TupleToolVtxIsoln.cpp LINK Analysis::DecayTreeTupleBaseLib diff --git a/Phys/DecayTreeTuple/src/TupleToolAllTracks.cpp b/Phys/DecayTreeTuple/src/TupleToolAllTracks.cpp deleted file mode 100644 index e0eb72a8..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolAllTracks.cpp +++ /dev/null @@ -1,781 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "TrackInterfaces/ITrackVertexer.h" - -#include "LoKi/ParticleProperties.h" - -#include "Kernel/GetIDVAlgorithm.h" -#include "Kernel/IDVAlgorithm.h" -#include "Kernel/IDistanceCalculator.h" -#include "Kernel/IPVReFitter.h" -#include "Kernel/IParticleDescendants.h" -#include "Kernel/IParticleTupleTool.h" -#include "Kernel/IVertexFit.h" - -#include "Event/Particle.h" -#include "Event/Vertex.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/Transform3DTypes.h" - -#include "boost/algorithm/string/replace.hpp" - -using namespace LHCb; - -/** - @brief Isolation tool based on TupleToolVtxIsoln by Mitesh Patel, Patrick Koppenburg, using ideas from -TupleToolSLTools The idea is to add particles, passing a selection that is set by configurable parameters, from given -TES location(s) to a (configurable) target particle in the decay chain and provide information that can be used to -isolate the specific decay, or to simply provide the information needed to study a new exclusive decay chain. - - In a pyton options-file, use e.g.: - @code - from Configurables import TupleToolAllTracks - AllTracks=TupleToolAllTracks("AllTracks") - locations = [] - loations.append('Phys/StdAllNoPIDsPions/Particles') - locations.append("Phys/StdLoosePi02gg/Particles") - locations.append("Phys/StdLooseAllPhotons/Particles") - AllTracks.VertexMode = 0 - AllTracks.ANNPIDCut = 0.3 #ProbNNPID cut on input particle of type PID - AllTracks.GhostProb = 0.5 - AllTracks.Theta = 0.012 #Cut on theta angle (less than) of the added input particle - AllTracks.DeltaPhi = 0.005 #Cut on the difference between phi angles (abs value less than) of target and added -particle AllTracks.NewVertexChi2 = 6 AllTracks.MHi = 7000 AllTracks.ImprovedVertex = 4 #new vertex chi^2 / ndof should -not be worse than 4 AllTracks.PVIPchi2 = 25 AllTracks.CorrectedMass = True AllTracks.InputParticles = locations - AllTracks.Target = Lambda_c+ #has to be defined in decay descriptor - @endcode - then add the tool to the head(!) of your chain. - If a cut is not explicitly given in the config file, no cut will be made. - - The VertexMode option takes values 0,1,2 describing the following scenarios: - - the new particle should be added to the target's mother (e.g. Lb -> (Sc->Lc {pi}) mu nu, where Sc is strongly -decaying to the target and a pion we want to add) - - the new particle should be added directly to the target decay vertex (e.g. {psi(2S)?} -> (J/psi -> mu mu) {pi} -{pi}, where the two pions are directly added to the dimuon vertex, because of the short J/psi lifetime) - - the new particle and the target form a new vertex (e.g. {B?} -> D0 {pi}, where D0 is target, pi is added particle. -Since the D0 decay vertex will be upstream of the B vertex due to it's lifetime, we need to make a new vertex) - - For a preselection of the added particles, one can use e.g. a FilterDesktop: - @code - pionFilter = FilterDesktop("PionFilter") - pionFilter.Code = "(P > 2.*GeV) & (P < 200.*GeV)" \ - "& (PT < 10.*GeV)" \ - "& (TRCHI2DOF < 3)" - SelStdNoPIDsPions = DataOnDemand(Location='Phys/StdAllNoPIDsPions/Particles') - - PifromB = Selection("SelPifromB", - Algorithm = pionFilter, - RequiredSelections = [SelStdNoPIDsPions]) - SeqPifromB = SelectionSequence("SeqPifromB", TopSelection = PifromB) - @endcode - and pass the outputlocation to the tool (if locations is your list of TES locations) - @code - locations.append(SeqPifromB.outputLocation()) - @endcode - - @note - The calculation of the corrected mass and it's error has not been cross-checked with existing algorithms yet. Use at -own risk! - - @date 2015-10-08 - @version v1r1 2016-06-08 : implemented VertexMode & possibility to add particles to head - @author Greg Ciezarek, Marco Fiore, Marian Stahl - -**/ -class TupleToolAllTracks : public TupleToolBase, virtual public IParticleTupleTool { -public: - // Standard constructor - TupleToolAllTracks( const std::string& type, const std::string& name, const IInterface* parent ); - virtual ~TupleToolAllTracks() {} - StatusCode initialize() override; - StatusCode fill( const Particle*, const Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& geometry ) override; - -private: - // Tools - IDVAlgorithm* m_dva; - IDistanceCalculator* m_dist; - const IVertexFit* m_pVertexFit; - IPVReFitter* m_pvReFitter; - std::string m_typeVertexFit; - IParticleDescendants* m_particleDescendants; - - // functions - bool isTrackInDecay( const Particle* particle, const Particle* mother ); - std::pair> getminipchi( const Particle* particle, IGeometryInfo const& geometry ); - std::vector getcorrm( const RecVertex* PV, const Vertex* SV, const Gaudi::LorentzVector& new_mother ); - - // member variables - std::vector m_InputParticles; - std::string m_TargetParticle; - int m_VModedummy; - enum class VMode { ToMother = 0, ToTarget, NewVertex }; - VMode m_VertexMode; - float m_ANNPIDCut; - float m_theta; - float m_deltaphi; - float m_GhostProb; - float m_DLLPIDCut; - float m_VertexChi2Cut; - float m_ipchi2Cut; - float m_PVipchi2Cut; - float m_improvedVertex; - float m_HiMassCut; - unsigned long m_mult; - bool m_addpxpypz; - bool m_addcorrm; -}; - -DECLARE_COMPONENT( TupleToolAllTracks ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolAllTracks::TupleToolAllTracks( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_dva( 0 ), m_dist( 0 ), m_pVertexFit( 0 ), m_particleDescendants( 0 ) { - declareInterface( this ); - - declareProperty( "InputParticles", m_InputParticles = {"Phys/StdAllNoPIDsPions/Particles"}, - "List of input Particles" ); - declareProperty( "Target", m_TargetParticle = "Charm", "Particle to add Particles to" ); - declareProperty( "VertexMode", m_VModedummy = 0, "Decay vertex to which the particle is added" ); - declareProperty( "ANNPID", m_ANNPIDCut = -1.f, - "Cut on ProbNN of added input particle type" ); // NB: if -1, no cut is placed - declareProperty( "Theta", m_theta = -1.f, - "Cut on theta angle of the added input particle" ); // NB: if -1, no cut is placed - declareProperty( "DeltaPhi", m_deltaphi = -1.f, - "Cut on the difference between phi angles of target and added particle" ); // NB: if -1, no cut is - // placed - declareProperty( "GhostProb", m_GhostProb = 1.f, - "Cut on the added input particle ghost probability" ); // NB: if -1, no cut is placed - declareProperty( "DLLPID", m_DLLPIDCut = -9999.f, "Cut on DLL of added input particle type" ); // NB: PIDPi == -PIDK! - declareProperty( "NewVertexChi2", m_VertexChi2Cut = -1.f, - "Cut on Vertex chi2/ndof with added particle" ); // NB: if -1, no cut is placed - declareProperty( "ImprovedVertex", m_improvedVertex = -1.f, - "Cut on Vertex chi2/ndof w added particle - Vertex chi2/ndof w/o added particle" ); // NB: if -1, no - // cut is placed - declareProperty( "IPchi2", m_ipchi2Cut = -1.f, - "Cut on IPchi2 of added particle w.r.t. new vertex" ); // NB: if -1, no cut is placed - declareProperty( "PVIPchi2", m_PVipchi2Cut = -1.f, - "Cut on IPchi2 of added particle w.r.t. closest primary vertex" ); // NB: if -1, no cut is placed - declareProperty( "MHi", m_HiMassCut = -1.f * Gaudi::Units::MeV, - "Cut on invariant mass of Target+input particles" ); // NB: if -1, no cut is placed - declareProperty( "AddMax", m_mult = 200, "Maximal number of added particles" ); - declareProperty( "WritePXPYPZ", m_addpxpypz = false, - "Write PX, PY, PZ of added particle alone and target+particle combination" ); - declareProperty( "CorrectedMass", m_addcorrm = false, - "Write corrected mass and it's error of mother+added particle" ); -} - -StatusCode TupleToolAllTracks::initialize() { - if ( !TupleToolBase::initialize() ) return StatusCode::FAILURE; - - for ( auto location = m_InputParticles.begin(); location != m_InputParticles.end(); location++ ) { - info() << "Adding particles from " << *location << " to a " << m_TargetParticle << endmsg; - if ( !exist( *location ) ) { - if ( msgLevel( MSG::WARNING ) ) - warning() << "No particles at " << *location << "! Skipping this TES location!" << endmsg; - m_InputParticles.erase( location ); - } - } - if ( m_InputParticles.empty() ) return StatusCode::FAILURE; - - // declareProperty can't deal with enums(?) - m_VertexMode = static_cast( m_VModedummy ); - - if ( m_addcorrm && m_VertexMode != VMode::ToMother && msgLevel( MSG::WARNING ) ) - warning() << "Writing the corrected mass is only implemented for VertexMode = 0.\n" - "No corrected mass output will be written to the tuple!" - << endmsg; - - if ( m_improvedVertex != -1 && m_VertexMode == VMode::NewVertex && msgLevel( MSG::WARNING ) ) - warning() << "Requested an improved vertex cut, but running in mode where a new vertex is made.\n" - "This cut will have no effect!" - << endmsg; - - // get tools - m_dva = Gaudi::Utils::getIDVAlgorithm( contextSvc() ); - m_dist = tool( "LoKi::DistanceCalculator", this ); - m_pvReFitter = tool( "LoKi::PVReFitter:PUBLIC", this ); - m_pVertexFit = m_dva->vertexFitter(); - m_particleDescendants = tool( "ParticleDescendants" ); - if ( !m_dva ) return Error( "Couldn't get parent DVAlgorithm", StatusCode::FAILURE ); - if ( !m_dist ) return Error( "Unable to retrieve the IDistanceCalculator tool", StatusCode::FAILURE ); - if ( !m_pvReFitter ) return Error( "Unable to retrieve the LoKi::PVReFitter", StatusCode::FAILURE ); - if ( !m_pVertexFit ) return Error( "Unable to retrieve the IVertexFit tool", StatusCode::FAILURE ); - if ( !m_particleDescendants ) return Error( "Unable to retrieve the ParticleDescendants tool", StatusCode::FAILURE ); - - return StatusCode::SUCCESS; -} - -StatusCode TupleToolAllTracks::fill( const Particle* mother, const Particle* Mother, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - const std::string prefix = fullName( head ) + "_Added"; - Assert( Mother && mother && m_dist, "This should not happen, you are inside TupleToolAllTracks.cpp :(" ); - - // set test true. It will be the StatusCode that is returned - bool test = true; - const auto pion_mass = 139.57 * Gaudi::Units::MeV; - const auto kaon_mass = 493.68 * Gaudi::Units::MeV; - const auto proton_mass = 938.272 * Gaudi::Units::MeV; - - // declare variables that will be written to the tuple - std::vector h_oldip, h_oldipchi2, h_newip, h_newipchi2, h_minipchi2; - std::vector h_opening, h_fdchi2_new, h_fdchi2_old, h_fd_new, h_fd_old; - std::vector h_vertexchi2_new, h_vertexchi2_old; - std::vector h_trackchi2, h_ghost; - std::vector h_tracktype; - std::vector h_PIDk, h_PIDe, h_PIDmu, h_PIDp, h_ProbNNp, h_ProbNNk, h_ProbNNe, h_ProbNNpi, h_ProbNNmu; - std::vector h_PT, h_ETA, h_PHI, h_THETA, h_DELPHI, h_PX, h_PY, h_PZ; - std::vector h_PID, h_ProbNNPID; - std::vector T_plus_h_M, M_h_CorrM, M_h_Delta_CorrM, T_plus_h_M_pion, M_h_CorrM_pion, M_h_Delta_CorrM_pion; - std::vector T_plus_h_M_proton, M_h_CorrM_proton, M_h_Delta_CorrM_proton, T_plus_h_M_kaon, M_h_CorrM_kaon, - M_h_Delta_CorrM_kaon; - std::vector T_plus_h_PT, T_plus_h_ETA, T_plus_h_PHI, T_plus_h_PX, T_plus_h_PY, T_plus_h_PZ; - std::vector VRFS; - std::vector newvertex_x, newvertex_y, newvertex_z, newPVx, newPVy, newPVz; - std::vector vertexcov_new, pvcov_new; - - Particle* Target = nullptr; - - // check if mother is target - auto mother_is_target = - !m_TargetParticle.compare( "Mother" ) //==0 means strings are equal - || Mother->particleID().abspid() == ( LoKi::Particles::pidFromName( m_TargetParticle ) ).abspid(); - if ( mother_is_target ) { - Target = const_cast( Mother ); - } else { - for ( auto tmpDaughter : Mother->daughtersVector() ) { - // tmp daughter is charm meson or baryon - bool default_charm = - ( ( 400 < tmpDaughter->particleID().abspid() && tmpDaughter->particleID().abspid() < 500 ) | - ( 4000 < tmpDaughter->particleID().abspid() && tmpDaughter->particleID().abspid() < 5000 ) ); - // declare particles in the decay chain as target - if ( !m_TargetParticle.compare( "Charm" ) ) { - if ( default_charm ) - Target = const_cast( tmpDaughter ); - else - continue; - } else if ( tmpDaughter->particleID().abspid() == ( LoKi::Particles::pidFromName( m_TargetParticle ) ).abspid() ) - Target = const_cast( tmpDaughter ); - else - continue; - } - } - - // If no target was found, or the mother is a basic particle, go to the next event - if ( Target == nullptr ) return StatusCode( test ); - if ( Mother->isBasicParticle() ) return StatusCode( test ); - - // get the vertex from the decay described in the DecayDescriptor (old vertex) - // here we have 3 different scenarios: - // - the new particle should be added to the target's mother - // (e.g. Lb -> (Sc->Lc {pi}) mu nu, where Sc is strongly decaying to the target and a pion we want to add) - // - the new particle should be added directly to the target decay vertex - // (e.g. {psi(2S)?} -> (J/psi -> mu mu) {pi} {pi}, where the two pions are directly added to the dimuon vertex, - // because of the short J/psi lifetime) - // - the new particle and the target form a new vertex - // (e.g. {B?} -> D0 {pi}, where D0 is target, pi is added particle. Since the D0 decay vertex will be upstream of - // the B vertex due to it's lifetime, we need to make a new vertex) contrary to the first 2 scenarios, it makes no - // sense to compare vertices in this case, since the vertex didn't exist before. - Vertex v; - Particle::ConstVector parts2Vertex; - if ( m_VertexMode == VMode::ToMother ) - parts2Vertex = Mother->daughtersVector(); - else if ( m_VertexMode == VMode::ToTarget ) - parts2Vertex = Target->daughtersVector(); - else - parts2Vertex.push_back( Target ); - if ( m_VertexMode != VMode::NewVertex ) - m_pVertexFit->fit( v, parts2Vertex, geometry ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - - // for all input particle locations - for ( auto location : m_InputParticles ) { - // get particles parts - auto parts = get( location ); - if ( msgLevel( MSG::DEBUG ) ) - debug() << "Getting particles from " << location << " with " << ( parts ).size() << " particles" << endmsg; - for ( auto* part : parts ) { - if ( !part ) { - info() << "particle to be added not found" << endmsg; - continue; - } - - auto PID = part->particleID().pid(); - // is basic or not one of the other basic particles that don't have a prototrack... (is there a query if a - // particle has a protoparticle?) - bool proto_exits = - part->isBasicParticle() && std::abs( PID ) != 22 && std::abs( PID ) != 111 && std::abs( PID ) != 221; - - // cut on track types includes Velo, VeloR, Long, Upstream and Downstream tracks - // skip tracks if they are already in the decay chain - if ( proto_exits && ( ( part->proto()->track()->type() < Track::Types::Velo || - part->proto()->track()->type() > Track::Types::Downstream ) || - isTrackInDecay( part, Mother ) ) ) - continue; - - auto pidK = -999.f, pide = -999.f, pidmu = -999.f, pidP = -999.f; - auto probNNe = -1.f, probNNk = -1.f, probNNp = -1.f, probNNpi = -1.f, probNNmu = -1.f, ghprob = -1.f; - auto ProbNNPID = 0, sign_long = 0, tracktype = 0; - - if ( proto_exits ) { - tracktype = part->proto()->track()->type(); - pidK = part->proto()->info( ProtoParticle::CombDLLk, -999 ); - pide = part->proto()->info( ProtoParticle::CombDLLe, -999 ); - pidmu = part->proto()->info( ProtoParticle::CombDLLmu, -999 ); - pidP = part->proto()->info( ProtoParticle::CombDLLp, -999 ); - std::vector probNNs; - probNNpi = part->proto()->info( ProtoParticle::ProbNNpi, -1 ); - probNNs.push_back( probNNpi ); - probNNmu = part->proto()->info( ProtoParticle::ProbNNmu, -1 ); - probNNs.push_back( probNNmu ); - probNNk = part->proto()->info( ProtoParticle::ProbNNk, -1 ); - probNNs.push_back( probNNk ); - probNNp = part->proto()->info( ProtoParticle::ProbNNp, -1 ); - probNNs.push_back( probNNp ); - probNNe = part->proto()->info( ProtoParticle::ProbNNe, -1 ); - probNNs.push_back( probNNe ); - ghprob = part->proto()->track()->ghostProbability(); - // get PID according most probable ProbNN value of the track - auto itelPID = std::distance( probNNs.begin(), std::max_element( probNNs.begin(), probNNs.end() ) ); - part->particleID().pid() < 0 ? sign_long = -1 : sign_long = 1; - auto PIDfromProbNN = [=]() { - if ( itelPID == 0 ) - return sign_long * 211; - else if ( itelPID == 1 ) - return -sign_long * 13; - else if ( itelPID == 2 ) - return sign_long * 321; - else if ( itelPID == 3 ) - return sign_long * 2212; - else if ( itelPID == 4 ) - return -sign_long * 11; - else - return -1; - }; - ProbNNPID = PIDfromProbNN(); - } - // Ghost Probability cut - if ( ghprob > m_GhostProb ) continue; - - // get PID variables for the input particle type and make the desired cut - auto PIDVariables_underPIDHypothesis = [=]() -> std::pair { - if ( std::abs( PID ) == 211 ) - return {probNNpi, -pidK}; - else if ( std::abs( PID ) == 321 ) - return {probNNk, pidK}; - else if ( std::abs( PID ) == 2212 ) - return {probNNp, pidP}; - else if ( std::abs( PID ) == 13 ) - return {probNNmu, pidmu}; - else if ( std::abs( PID ) == 11 ) - return {probNNe, pide}; - else - return {1.f, 100.f}; - }; - if ( PIDVariables_underPIDHypothesis().first < m_ANNPIDCut || - PIDVariables_underPIDHypothesis().second < m_DLLPIDCut ) - continue; - - // calculate the Target+particle mass and make the desired cut - const auto TH = Gaudi::LorentzVector( Target->momentum() + part->momentum() ); - auto Th_mass = TH.M(); - if ( m_HiMassCut != -1 * Gaudi::Units::MeV && Th_mass > m_HiMassCut ) continue; - // Theta angle - float theta_part = part->momentum().theta(); - if ( theta_part < m_theta ) continue; - - float Delta_phi = Target->momentum().phi() - part->momentum().phi(); - if ( std::fabs( Delta_phi ) < m_deltaphi ) continue; - - // PV min ipchi2 - auto PVinfo = getminipchi( part, geometry ); - if ( m_PVipchi2Cut != -1 && PVinfo.first < m_PVipchi2Cut ) continue; - - // Fit a vertex with the added particle - bool VertexRefit = true; - Vertex vtxWithExtraTrack; - Particle* tmp_part = new Particle( *part ); - parts2Vertex.push_back( tmp_part ); - VertexRefit &= m_pVertexFit->fit( vtxWithExtraTrack, parts2Vertex, geometry ); - parts2Vertex.pop_back(); - delete tmp_part; - - double oldip = 0, oldipchi2 = 0, newip, newipchi2, oldfd = 0, oldfdchi2 = 0, newfd, newfdchi2; - // Vertex chi2's - auto newvertchi2 = vtxWithExtraTrack.chi2PerDoF(); - if ( m_VertexChi2Cut != -1 && ( newvertchi2 > m_VertexChi2Cut || newvertchi2 < 0 ) ) continue; - auto oldvertchi2 = m_VertexMode != VMode::NewVertex ? v.chi2PerDoF() : 0.f; - if ( m_improvedVertex != -1 && m_VertexMode != VMode::NewVertex && - ( newvertchi2 > oldvertchi2 + m_improvedVertex || newvertchi2 < 0 ) ) - continue; - // Vertex IP's - m_dist->distance( part, &vtxWithExtraTrack, newip, newipchi2, geometry ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - if ( newipchi2 < 0 || ( m_ipchi2Cut != -1 && newipchi2 > m_ipchi2Cut ) ) continue; - if ( m_VertexMode != VMode::NewVertex ) { - m_dist->distance( part, &v, oldip, oldipchi2, geometry ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - if ( oldipchi2 < 0 ) continue; - } - - h_minipchi2.push_back( PVinfo.first ); - - // FD's - m_dist->distance( PVinfo.second.get(), &vtxWithExtraTrack, newfd, newfdchi2 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - if ( m_VertexMode != VMode::NewVertex ) - m_dist->distance( PVinfo.second.get(), &v, oldfd, oldfdchi2 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - - // opening angle between added particle and mother - h_opening.push_back( Mother->momentum().Dot( part->momentum() ) / - sqrt( Mother->momentum().mag2() * part->momentum().mag2() ) ); - - // Masses and corrected masses - std::vector tmp_vec; - ROOT::Math::PxPyPzM4D Tg, h; - Tg.SetPxPyPzE( Target->momentum().px(), Target->momentum().py(), Target->momentum().pz(), - Target->momentum().E() ); - h.SetPxPyPzE( part->momentum().px(), part->momentum().py(), part->momentum().pz(), part->momentum().E() ); - - T_plus_h_M.push_back( Th_mass ); - if ( m_addcorrm && m_VertexMode == VMode::ToMother ) { - tmp_vec = getcorrm( PVinfo.second.get(), &vtxWithExtraTrack, ( Mother->momentum() + part->momentum() ) ); - M_h_CorrM.push_back( tmp_vec.at( 0 ) ); - M_h_Delta_CorrM.push_back( tmp_vec.at( 1 ) ); - } - - h.SetM( pion_mass ); - T_plus_h_M_pion.push_back( - ( static_cast( Tg ) + static_cast( h ) ).M() ); - if ( m_addcorrm && m_VertexMode == VMode::ToMother ) { - tmp_vec = getcorrm( PVinfo.second.get(), &vtxWithExtraTrack, - ( Mother->momentum() + static_cast( h ) ) ); - M_h_CorrM_pion.push_back( tmp_vec.at( 0 ) ); - M_h_Delta_CorrM_pion.push_back( tmp_vec.at( 1 ) ); - } - - h.SetM( kaon_mass ); - T_plus_h_M_kaon.push_back( - ( static_cast( Tg ) + static_cast( h ) ).M() ); - if ( m_addcorrm && m_VertexMode == VMode::ToMother ) { - tmp_vec = getcorrm( PVinfo.second.get(), &vtxWithExtraTrack, - ( Mother->momentum() + static_cast( h ) ) ); - M_h_CorrM_kaon.push_back( tmp_vec.at( 0 ) ); - M_h_Delta_CorrM_kaon.push_back( tmp_vec.at( 1 ) ); - } - - h.SetM( proton_mass ); - T_plus_h_M_proton.push_back( - ( static_cast( Tg ) + static_cast( h ) ).M() ); - if ( m_addcorrm && m_VertexMode == VMode::ToMother ) { - tmp_vec = getcorrm( PVinfo.second.get(), &vtxWithExtraTrack, - ( Mother->momentum() + static_cast( h ) ) ); - M_h_CorrM_proton.push_back( tmp_vec.at( 0 ) ); - M_h_Delta_CorrM_proton.push_back( tmp_vec.at( 1 ) ); - } - - T_plus_h_PT.push_back( TH.pt() ); - T_plus_h_ETA.push_back( TH.eta() ); - T_plus_h_PHI.push_back( TH.phi() ); - if ( m_addpxpypz ) { - T_plus_h_PX.push_back( TH.px() ); - T_plus_h_PY.push_back( TH.py() ); - T_plus_h_PZ.push_back( TH.pz() ); - h_PX.push_back( part->momentum().px() ); - h_PY.push_back( part->momentum().py() ); - h_PZ.push_back( part->momentum().pz() ); - } - h_PT.push_back( part->momentum().pt() ); - h_ETA.push_back( part->momentum().eta() ); - h_PHI.push_back( part->momentum().phi() ); - h_THETA.push_back( theta_part ); - h_DELPHI.push_back( Delta_phi ); - if ( m_VertexMode != VMode::NewVertex ) { - h_oldip.push_back( (float)oldip ); - h_oldipchi2.push_back( (float)oldipchi2 ); - h_fdchi2_old.push_back( (float)oldfdchi2 ); - h_fd_old.push_back( (float)oldfd ); - h_vertexchi2_old.push_back( oldvertchi2 ); - } - h_newip.push_back( (float)newip ); - h_newipchi2.push_back( (float)newipchi2 ); - h_fdchi2_new.push_back( (float)newfd ); - h_fd_new.push_back( (float)newfdchi2 ); - h_vertexchi2_new.push_back( newvertchi2 ); - if ( proto_exits ) { - h_PIDk.push_back( pidK ); - h_PIDe.push_back( pide ); - h_PIDp.push_back( pidP ); - h_PIDmu.push_back( pidmu ); - h_ProbNNpi.push_back( probNNpi ); - h_ProbNNp.push_back( probNNp ); - h_ProbNNe.push_back( probNNe ); - h_ProbNNk.push_back( probNNk ); - h_ProbNNmu.push_back( probNNmu ); - h_ghost.push_back( ghprob ); - h_trackchi2.push_back( part->proto()->track()->chi2PerDoF() ); - h_tracktype.push_back( tracktype ); - h_ProbNNPID.push_back( ProbNNPID ); - } - h_PID.push_back( PID ); - VRFS.push_back( VertexRefit ); - newvertex_x.push_back( vtxWithExtraTrack.position().X() ); - newvertex_y.push_back( vtxWithExtraTrack.position().Y() ); - newvertex_z.push_back( vtxWithExtraTrack.position().Z() ); - newPVx.push_back( PVinfo.second->position().X() ); - newPVy.push_back( PVinfo.second->position().Y() ); - newPVz.push_back( PVinfo.second->position().Z() ); - vertexcov_new.push_back( vtxWithExtraTrack.covMatrix() ); - pvcov_new.push_back( PVinfo.second->covMatrix() ); - } - } - - auto target_tup_name = m_TargetParticle; - boost::algorithm::replace_all( target_tup_name, "*", "St" ); - boost::algorithm::replace_all( target_tup_name, "-", "m" ); - boost::algorithm::replace_all( target_tup_name, "+", "p" ); - boost::algorithm::replace_all( target_tup_name, "~", "bar" ); - boost::algorithm::replace_all( target_tup_name, "'", "prime" ); - boost::algorithm::replace_all( target_tup_name, "(", "_" ); - boost::algorithm::replace_all( target_tup_name, ")", "_" ); - - // If array is bigger than m_mult entries per mother, we are still safe with the StatusCode, because farray will only - // throw a warning and not a bad status code in this case - test &= tuple->farray( prefix + "_" + target_tup_name + "H_M", T_plus_h_M.begin(), T_plus_h_M.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_M_pion", T_plus_h_M_pion.begin(), T_plus_h_M_pion.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_M_kaon", T_plus_h_M_kaon.begin(), T_plus_h_M_kaon.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_M_proton", T_plus_h_M_proton.begin(), - T_plus_h_M_proton.end(), prefix + "_n_Particles", m_mult ); - if ( m_addcorrm && m_VertexMode == VMode::ToMother ) { - test &= tuple->farray( fullName( head ) + "_dauH_CorrM", M_h_CorrM.begin(), M_h_CorrM.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrM_pion", M_h_CorrM_pion.begin(), M_h_CorrM_pion.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrM_kaon", M_h_CorrM_kaon.begin(), M_h_CorrM_kaon.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrM_proton", M_h_CorrM_proton.begin(), M_h_CorrM_proton.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrMErr", M_h_Delta_CorrM.begin(), M_h_Delta_CorrM.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrMErr_pion", M_h_Delta_CorrM_pion.begin(), - M_h_Delta_CorrM_pion.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrMErr_kaon", M_h_Delta_CorrM_kaon.begin(), - M_h_Delta_CorrM_kaon.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_dauH_CorrMErr_proton", M_h_Delta_CorrM_proton.begin(), - M_h_Delta_CorrM_proton.end(), prefix + "_n_Particles", m_mult ); - } - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PT", T_plus_h_PT.begin(), T_plus_h_PT.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_ETA", T_plus_h_ETA.begin(), T_plus_h_ETA.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PHI", T_plus_h_PHI.begin(), T_plus_h_PHI.end(), - prefix + "_n_Particles", m_mult ); - if ( m_addpxpypz ) { - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PX", T_plus_h_PX.begin(), T_plus_h_PX.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PY", T_plus_h_PY.begin(), T_plus_h_PY.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PZ", T_plus_h_PZ.begin(), T_plus_h_PZ.end(), - prefix + "_n_Particles", m_mult ); - } - if ( m_VertexMode != VMode::NewVertex ) - test &= tuple->farray( prefix + "_" + target_tup_name + "H_FDCHI2_OLD", h_fdchi2_old.begin(), h_fdchi2_old.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_FDCHI2_NEW", h_fdchi2_new.begin(), h_fdchi2_new.end(), - prefix + "_n_Particles", m_mult ); - if ( m_VertexMode != VMode::NewVertex ) - test &= tuple->farray( prefix + "_" + target_tup_name + "H_FD_OLD", h_fd_old.begin(), h_fd_old.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_FD_NEW", h_fd_new.begin(), h_fd_new.end(), - prefix + "_n_Particles", m_mult ); - if ( m_VertexMode != VMode::NewVertex ) - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VERTEXCHI2_OLD", h_vertexchi2_old.begin(), - h_vertexchi2_old.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VERTEXCHI2_NEW", h_vertexchi2_new.begin(), - h_vertexchi2_new.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VERTEX_X_NEW", newvertex_x.begin(), newvertex_x.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VERTEX_Y_NEW", newvertex_y.begin(), newvertex_y.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VERTEX_Z_NEW", newvertex_z.begin(), newvertex_z.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PV_X_NEW", newPVx.begin(), newPVx.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PV_Y_NEW", newPVy.begin(), newPVy.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PV_Z_NEW", newPVz.begin(), newPVz.end(), - prefix + "_n_Particles", m_mult ); - - // The following line doesn't work with that type, so write the individual components to the tuple - // test &= tuple -> put ( prefix + "_H_VERTEX_COV_NEW", - // const_cast*>(&h_vertexcov_new)); - std::vector xyz = {"X", "Y", "Z"}; - for ( unsigned int i = 0; i < 3; i++ ) { - for ( unsigned int j = i; j < 3; j++ ) { - std::vector tmp_cov_vec, tmp_pv_cov; - for ( unsigned int k = 0; k < vertexcov_new.size(); k++ ) { - tmp_cov_vec.push_back( vertexcov_new.at( k ).At( i, j ) ); - tmp_pv_cov.push_back( pvcov_new.at( k ).At( i, j ) ); - } - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VERTEX_COV_" + xyz.at( i ) + xyz.at( j ), - tmp_cov_vec.begin(), tmp_cov_vec.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_PV_COV_" + xyz.at( i ) + xyz.at( j ), - tmp_pv_cov.begin(), tmp_pv_cov.end(), prefix + "_n_Particles", m_mult ); - } - } - - test &= tuple->farray( prefix + "_" + target_tup_name + "H_VertexRefitStatus", VRFS.begin(), VRFS.end(), - prefix + "_n_Particles", m_mult ); - if ( m_VertexMode != VMode::NewVertex ) { - test &= tuple->farray( prefix + "_" + target_tup_name + "H_IPCHI2_OLD", h_oldipchi2.begin(), h_oldipchi2.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_IP_OLD", h_oldip.begin(), h_oldip.end(), - prefix + "_n_Particles", m_mult ); - } - test &= tuple->farray( prefix + "_" + target_tup_name + "H_IPCHI2_NEW", h_newipchi2.begin(), h_newipchi2.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_IP_NEW", h_newip.begin(), h_newip.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_" + target_tup_name + "H_MINIPCHI2", h_minipchi2.begin(), h_minipchi2.end(), - prefix + "_n_Particles", m_mult ); - test &= tuple->farray( fullName( head ) + "_H_OPENING", h_opening.begin(), h_opening.end(), prefix + "_n_Particles", - m_mult ); - if ( m_addpxpypz ) { - test &= tuple->farray( prefix + "_H_PX", h_PX.begin(), h_PX.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_PY", h_PY.begin(), h_PY.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_PZ", h_PZ.begin(), h_PZ.end(), prefix + "_n_Particles", m_mult ); - } - test &= tuple->farray( prefix + "_H_PT", h_PT.begin(), h_PT.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_ETA", h_ETA.begin(), h_ETA.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_PHI", h_PHI.begin(), h_PHI.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_THETA", h_THETA.begin(), h_THETA.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_DELTAPHI", h_DELPHI.begin(), h_DELPHI.end(), prefix + "_n_Particles", m_mult ); - test &= tuple->farray( prefix + "_H_PID", h_PID.begin(), h_PID.end(), prefix + "_n_Particles", m_mult ); - test &= - tuple->farray( prefix + "_H_PROBNNPID", h_ProbNNPID.begin(), h_ProbNNPID.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_GHOST", h_ghost.begin(), h_ghost.end(), prefix + "_n_Tracks", m_mult ); - test &= - tuple->farray( prefix + "_H_TRACKCHI2", h_trackchi2.begin(), h_trackchi2.end(), prefix + "_n_Tracks", m_mult ); - test &= - tuple->farray( prefix + "_H_TRACKTYPE", h_tracktype.begin(), h_tracktype.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_PIDe", h_PIDe.begin(), h_PIDe.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_PIDK", h_PIDk.begin(), h_PIDk.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_PIDmu", h_PIDmu.begin(), h_PIDmu.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_PIDp", h_PIDp.begin(), h_PIDp.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_ProbNNpi", h_ProbNNpi.begin(), h_ProbNNpi.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_ProbNNk", h_ProbNNk.begin(), h_ProbNNk.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_ProbNNp", h_ProbNNp.begin(), h_ProbNNp.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_ProbNNe", h_ProbNNe.begin(), h_ProbNNe.end(), prefix + "_n_Tracks", m_mult ); - test &= tuple->farray( prefix + "_H_ProbNNmu", h_ProbNNmu.begin(), h_ProbNNmu.end(), prefix + "_n_Tracks", m_mult ); - - return StatusCode( test ); -} - -//============================================================================= -// Check if the track is already in the decay -//============================================================================= -bool TupleToolAllTracks::isTrackInDecay( const Particle* particle, const Particle* mother ) { - bool isInDecay = false; - // loop over daughters - auto stable_daughters = m_particleDescendants->finalStates( mother ); - if ( stable_daughters.empty() ) return isInDecay; - for ( auto* it : stable_daughters ) { - if ( std::abs( it->particleID().pid() ) != 22 && std::abs( it->particleID().pid() ) != 111 && - std::abs( it->particleID().pid() ) != 221 ) { - if ( it->proto()->track() == particle->proto()->track() ) { - if ( msgLevel( MSG::DEBUG ) ) debug() << "Track is in decay, skipping it" << endmsg; - isInDecay = true; - break; - } - } - } - return isInDecay; -} - -//============================================================================= -// MINIPCHI2 for a Particle | Thanks to Roel for correcting this part of code! -//============================================================================= -std::pair> TupleToolAllTracks::getminipchi( const Particle* particle, - IGeometryInfo const& geometry ) { - float minchi2 = -1.f; - RecVertex* bestPV = nullptr; - auto PV = m_dva->primaryVertices(); - if ( PV.empty() ) return {minchi2, nullptr}; - for ( auto pv : PV ) { - double ip, chi2; - m_dist->distance( particle, pv, ip, chi2, geometry ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - if ( ( chi2 < minchi2 ) || ( minchi2 < 0.0 ) ) { - RecVertex* newPV = pv->clone(); - // remove particle refit vertex - m_pvReFitter->remove( particle, newPV, geometry ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - m_dist->distance( particle, newPV, ip, chi2, geometry ).ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - minchi2 = chi2; - delete bestPV; - bestPV = newPV; - } - } - return {minchi2, std::unique_ptr( bestPV )}; -} - -//============================================================================= -// Corrected mass for mother + additional particle -//============================================================================= -std::vector TupleToolAllTracks::getcorrm( const RecVertex* PV, const Vertex* SV, - const Gaudi::LorentzVector& new_mother ) { - // Calculations taken from Lb -> p mu nu note: https://cds.cern.ch/record/1694339/files/LHCb-ANA-2014-048.pdf - auto dir = SV->position() - PV->position(); - auto mom = new_mother.Vect(); - auto dmag2 = dir.Mag2(); - auto longit_norm = 0.f; - if ( 0.f != dmag2 ) longit_norm = mom.Dot( dir ) / dmag2; - auto ptprime = mom - dir * longit_norm; - float CorrM = (float)sqrt( pow( new_mother.M(), 2 ) + ptprime.Mag2() ) + sqrt( ptprime.Mag2() ); - - // calculate derivatives of longit_norm - auto dlon_dx = ( 2 * dir.x() * mom.Dot( dir ) - mom.x() * dmag2 ) / ( pow( dmag2, 2 ) ); - auto dlon_dy = ( 2 * dir.y() * mom.Dot( dir ) - mom.y() * dmag2 ) / ( pow( dmag2, 2 ) ); - auto dlon_dz = ( 2 * dir.z() * mom.Dot( dir ) - mom.z() * dmag2 ) / ( pow( dmag2, 2 ) ); - - // derivatives of pt (from Michael Kolpin) - std::vector pt_derivatives; - if ( ptprime.Mag2() == 0.f ) return {CorrM, -1.f}; - pt_derivatives.push_back( ( longit_norm * ptprime.x() - dlon_dx * ( ptprime.x() + ptprime.y() + ptprime.z() ) ) / - sqrt( ptprime.Mag2() ) ); - pt_derivatives.push_back( ( longit_norm * ptprime.y() - dlon_dy * ( ptprime.x() + ptprime.y() + ptprime.z() ) ) / - sqrt( ptprime.Mag2() ) ); - pt_derivatives.push_back( ( longit_norm * ptprime.z() - dlon_dz * ( ptprime.x() + ptprime.y() + ptprime.z() ) ) / - sqrt( ptprime.Mag2() ) ); - - // uncertainty of pt - auto PV_cov = PV->covMatrix(); - auto SV_cov = SV->covMatrix(); - auto delta_ptprime2 = 0.f; - for ( auto i = 0; i < 3; i++ ) { - for ( auto j = 0; j < 3; j++ ) { - delta_ptprime2 += pt_derivatives.at( i ) * pt_derivatives.at( j ) * ( PV_cov.At( i, j ) + SV_cov.At( i, j ) ); - if ( i != j ) delta_ptprime2 *= 2; - } - } - // uncertainty on m_corr - float delta_Corr_M = (float)( sqrt( ptprime.Mag2() ) / sqrt( pow( new_mother.M(), 2 ) + ptprime.Mag2() ) + 1.0 ) * - sqrt( delta_ptprime2 ); - - return {CorrM, delta_Corr_M}; -} diff --git a/Phys/DecayTreeTuple/src/TupleToolAngles.cpp b/Phys/DecayTreeTuple/src/TupleToolAngles.cpp deleted file mode 100644 index ed95efbf..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolAngles.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" - -#include "Event/Particle.h" - -#include "Kernel/IParticleTupleTool.h" // Interface - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/PhysicalConstants.h" -#include "GaudiKernel/Vector3DTypes.h" -#include "GaudiKernel/Vector4DTypes.h" - -#include "Math/Boost.h" - -#include "gsl/gsl_sys.h" - -/** - * Fill MC Particle with decay angle in mother frame - * - * - head_CosTheta : angle in mother's frame - * - if WRTMother is false, will calculate angle in frame of top of tree - * - * \sa MCTupleToolAngles, DecayTreeTuple, MCDecayTreeTuple - * - * @author Patrick Koppenburg - * @date 2009-01-21 - * @author R. Lambert - * @date 2009-09-04 - */ - -class TupleToolAngles : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolAngles( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - inline double cosTheta( const Gaudi::LorentzVector& mother, const Gaudi::LorentzVector& mcp ) { - ROOT::Math::Boost boost( mother.BoostToCM() ); - const Gaudi::XYZVector boostedParticle = ( boost( mcp ) ).Vect().unit(); - const Gaudi::XYZVector boostedMother = mother.Vect().unit(); - double cosT = boostedParticle.Dot( boostedMother ); - if ( msgLevel( MSG::VERBOSE ) ) - verbose() << mother << " " << mcp << " " << boostedMother << " " << boostedParticle << " " << cosT << endmsg; - return cosT; - } - - const LHCb::Particle* findMother( const LHCb::Particle* top, const LHCb::Particle* P ) const; - - bool m_wrtMother; -}; - -using namespace LHCb; - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolAngles ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolAngles::TupleToolAngles( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_wrtMother( 0 ) { - declareInterface( this ); - declareProperty( "WRTMother", m_wrtMother = true, "Turn false to fill angles with respect to top of tree" ); -} - -//============================================================================= -// Fill -//============================================================================= -StatusCode TupleToolAngles::fill( const LHCb::Particle* top, const LHCb::Particle* part, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& ) { - const std::string prefix = fullName( head ); - - bool test = true; - const LHCb::Particle* mother = top; - if ( m_wrtMother ) mother = findMother( top, part ); - if ( 0 == part || 0 == mother || part == mother ) return StatusCode::SUCCESS; - double cosT = cosTheta( mother->momentum(), part->momentum() ); - // fill the tuple: - test &= tuple->column( prefix + "_CosTheta", cosT ); - if ( isVerbose() ) test &= tuple->column( prefix + "_Theta", acos( cosT ) ); - if ( msgLevel( MSG::DEBUG ) ) - debug() << mother->particleID().pid() << " " << mother->momentum() << " " << part->particleID().pid() << " " - << part->momentum() << endmsg; - return StatusCode( test ); -} -//============================================================================= -// Fill -//============================================================================= - -const LHCb::Particle* TupleToolAngles::findMother( const LHCb::Particle* top, const Particle* P ) const { - if ( top == P || top->isBasicParticle() ) return 0; - - const SmartRefVector& dau = top->daughters(); - if ( dau.empty() ) return 0; - - SmartRefVector::const_iterator it; - for ( it = dau.begin(); dau.end() != it; ++it ) { - if ( P == *it ) { // I found the daughter - return top; - } - } - - // vertex not yet found, get deeper in the decay: - for ( it = dau.begin(); dau.end() != it; ++it ) { - if ( P != *it && !( *it )->isBasicParticle() ) { - const LHCb::Particle* tm = findMother( *it, P ); - if ( tm ) return tm; - } - } - return 0; -} diff --git a/Phys/DecayTreeTuple/src/TupleToolBremInfo.cpp b/Phys/DecayTreeTuple/src/TupleToolBremInfo.cpp deleted file mode 100644 index 224dd0da..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolBremInfo.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" - -#include "CaloUtils/CaloMomentum.h" -#include "Event/Particle.h" - -#include "Kernel/IBremAdder.h" -#include "Kernel/IParticlePropertySvc.h" -#include "Kernel/IParticleTupleTool.h" -#include "Kernel/ParticleProperty.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" -#include "GaudiKernel/IRegistry.h" - -#include - -#include - -class TupleToolBremInfo : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolBremInfo( const std::string& type, const std::string& name, const IInterface* parent ); - StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& geometry ) override; - -private: - const LHCb::ParticleProperty* property( const LHCb::ParticleID pid ) { - return ( m_ppsvc ) ? m_ppsvc->find( pid ) : NULL; - }; - LHCb::IParticlePropertySvc* m_ppsvc; - IBremAdder* m_adder; - std::vector m_parts; - std::vector m_pids; - bool m_dst; -}; - -using namespace Gaudi; -using namespace LHCb; - -TupleToolBremInfo::TupleToolBremInfo( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_parts(), m_pids() { - declareInterface( this ); - declareProperty( "Particle", m_parts ); - declareProperty( "fullDST", m_dst = true ); // to switch off/on information not available on microDST - m_parts.push_back( "e+" ); - m_parts.push_back( "gamma" ); // for gamma->e+e- -} - -StatusCode TupleToolBremInfo::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - m_adder = tool( "BremAdder", "BremAdder", this ); - - m_ppsvc = svc( "LHCb::ParticlePropertySvc", true ); - if ( !m_parts.empty() ) { - for ( std::vector::const_iterator p = m_parts.begin(); m_parts.end() != p; ++p ) { - const LHCb::ParticleProperty* pp = m_ppsvc->find( *p ); - if ( pp ) { m_pids.push_back( pp->pdgID().abspid() ); } - } - } - - return sc; -} - -StatusCode TupleToolBremInfo::fill( const Particle*, const Particle* P, const std::string& head, Tuples::Tuple& tuple, - IGeometryInfo const& geometry ) { - if ( !P ) return StatusCode::SUCCESS; - - const std::string prefix = fullName( head ); - - bool ok = false; - for ( std::vector::const_iterator pid = m_pids.begin(); m_pids.end() != pid; ++pid ) { - if ( P->particleID().abspid() == *pid ) { - ok = true; - break; - } - } - if ( !ok ) return StatusCode::SUCCESS; - - bool filltuple = true; - if ( P->isBasicParticle() && P->proto() != NULL && P->proto()->track() != NULL ) { - LHCb::CaloMomentum brem = m_adder->bremMomentum( P, geometry ); - if ( msgLevel( MSG::VERBOSE ) ) { // https://its.cern.ch/jira/browse/LHCBPS-598 - verbose() << "Multi : " << brem.multiplicity() << endmsg; - verbose() << " Brem P : " << brem.momentum() << endmsg; - verbose() << " Origin : " << brem.referencePoint() << endmsg; - } - - // brem info from the particle (from creation) - filltuple &= tuple->column( prefix + "_HasBremAdded", P->info( LHCb::Particle::HasBremAdded, 0. ) > 0 ); - filltuple &= tuple->column( prefix + "_BremMultiplicity", - P->info( LHCb::Particle::HasBremAdded, 0. ) ); // replace the multiplicity() method that - // need fullDST - // brem info from rerunning the BremAdder, looking at the photons - // This is not correct when running on an mDST - you look at a subset of the total photons in the event. - if ( (int)P->info( LHCb::Particle::HasBremAdded, 0. ) != (int)brem.multiplicity() && m_dst ) - Warning( "TupleToolBremInfo requires fullDST - BremP and BremOrigin might not be reliable (Multiplicity is OK)", - StatusCode::SUCCESS, 5 ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - if ( m_dst ) filltuple &= tuple->column( prefix + "_BremP", brem.momentum() ); // need fullDST - if ( m_dst ) filltuple &= tuple->column( prefix + "_BremOrigin", brem.referencePoint() ); // need fullDST - - } else { - // e.g. diElectron - LHCb::Particle::ConstVector daughters = P->daughtersVector(); - if ( daughters.size() != 2 ) return StatusCode( filltuple ); - - const LHCb::Particle* p1 = NULL; - const LHCb::Particle* p2 = NULL; - int k = 0; - for ( LHCb::Particle::ConstVector::const_iterator itmp = daughters.begin(); itmp != daughters.end(); itmp++ ) { - const LHCb::Particle* p = *itmp; - if ( p1 == NULL ) - p1 = p; - else - p2 = p; - for ( std::vector::const_iterator pid = m_pids.begin(); m_pids.end() != pid; ++pid ) { - if ( p->particleID().abspid() == *pid ) { - k++; - break; - } - } - } - if ( k != 2 || p1 == NULL || p2 == NULL ) return StatusCode( filltuple ); - // OK let's evaluate the brem for (p1,p2) system - - double mult = p1->info( LHCb::Particle::HasBremAdded, 0. ) + p2->info( LHCb::Particle::HasBremAdded, 0. ); - const std::pair brems = m_adder->bremMomenta( p1, p2, geometry ); - LHCb::CaloMomentum b1 = brems.first; - LHCb::CaloMomentum b2 = brems.second; - filltuple &= tuple->column( prefix + "_DiEBremMultiplicity", mult ); - if ( m_dst ) filltuple &= tuple->column( prefix + "_DiEBremP", b1.momentum() + b2.momentum() ); - std::string name1 = property( p1->particleID() )->name(); - std::string name2 = property( p2->particleID() )->name(); - boost::replace_all( name1, "+", "plus" ); - boost::replace_all( name1, "-", "minus" ); - boost::replace_all( name2, "+", "plus" ); - boost::replace_all( name2, "-", "minus" ); - filltuple &= - tuple->column( prefix + "_" + name1 + "_DiEBremMultiplicity", p1->info( LHCb::Particle::HasBremAdded, 0. ) ); - if ( m_dst ) filltuple &= tuple->column( prefix + "_" + name1 + "_DiEBremP", b1.momentum() ); - filltuple &= - tuple->column( prefix + "_" + name2 + "_DiEBremMultiplicity", p2->info( LHCb::Particle::HasBremAdded, 0. ) ); - if ( m_dst ) filltuple &= tuple->column( prefix + "_" + name2 + "_DiEBremP", b2.momentum() ); - - // standalone evaluation - if ( m_dst ) { - LHCb::CaloMomentum sb1 = m_adder->bremMomentum( p1, geometry ); - LHCb::CaloMomentum sb2 = m_adder->bremMomentum( p2, geometry ); - filltuple &= tuple->column( prefix + "_" + name1 + "_StandaloneBremMultiplicity", sb1.multiplicity() ); - filltuple &= tuple->column( prefix + "_" + name2 + "_StandaloneBremMultiplicity", sb2.multiplicity() ); - } - } - - return StatusCode( filltuple ); -} - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolBremInfo ) diff --git a/Phys/DecayTreeTuple/src/TupleToolCaloDigits.cpp b/Phys/DecayTreeTuple/src/TupleToolCaloDigits.cpp deleted file mode 100644 index 0e7959c2..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolCaloDigits.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -// Include files - -// local -#include "TupleToolCaloDigits.h" - -#include "GaudiAlg/ITupleTool.h" -#include "GaudiAlg/Tuple.h" - -#include "Event/CaloDigit.h" - -#include "GaudiKernel/IRegistry.h" // IOpaqueAddress - -#include "CaloDet/DeCalorimeter.h" - -//----------------------------------------------------------------------------- -// Implementation file for class : TupleToolCaloDigits -// -// 2015-08-05 Albert Bursche -//----------------------------------------------------------------------------- - -// Declaration of the Tool Factory -DECLARE_COMPONENT( TupleToolCaloDigits ) - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolCaloDigits::TupleToolCaloDigits( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ) { - declareInterface( this ); - declareProperty( "DigitLocation", m_DigitLocation ); - declareProperty( "CaloName", m_CaloName ); - declareProperty( "CaloLocation", m_CaloLocation ); - declareProperty( "MaxDigits", m_maxSize ); - declareProperty( "AutoConfigure", m_auto_configure ); -} -//============================================================================= - -StatusCode TupleToolCaloDigits::initialize() { - if ( m_auto_configure ) { - if ( m_CaloName.compare( "Spd" ) == 0 ) { - m_CaloLocation = DeCalorimeterLocation::Spd; - m_DigitLocation = LHCb::CaloDigitLocation::Spd; - return StatusCode::SUCCESS; - } - if ( m_CaloName.compare( "Prs" ) == 0 ) { - m_CaloLocation = DeCalorimeterLocation::Prs; - m_DigitLocation = LHCb::CaloDigitLocation::Prs; - return StatusCode::SUCCESS; - } - if ( m_CaloName.compare( "Ecal" ) == 0 ) { - m_CaloLocation = DeCalorimeterLocation::Ecal; - m_DigitLocation = LHCb::CaloDigitLocation::Ecal; - return StatusCode::SUCCESS; - } - if ( m_CaloName.compare( "Hcal" ) == 0 ) { - m_CaloLocation = DeCalorimeterLocation::Hcal; - m_DigitLocation = LHCb::CaloDigitLocation::Hcal; - return StatusCode::SUCCESS; - } - // Feel free to add more locations from Event/CaloDigit.h - fatal() << "Invalid CaloName. Mus be one of Spd,Prs,Ecal,Hcal if AutoConfigure is used (i.e. true)" << endmsg; - return StatusCode::FAILURE; - } - return StatusCode::SUCCESS; -} -StatusCode TupleToolCaloDigits::finalize() { return StatusCode::SUCCESS; } -StatusCode TupleToolCaloDigits::fill( Tuples::Tuple& tuple ) { - const std::string prefix = fullName(); - LHCb::CaloDigits* digits = getIfExists( m_DigitLocation ); - if ( !digits ) return StatusCode::SUCCESS; - DeCalorimeter* calo = getDet( m_CaloLocation ); - for ( const auto& digit : *digits ) { - const LHCb::CaloCellID cellID = digit->cellID(); - m_index.push_back( cellID.index() ); - m_calo.push_back( cellID.calo() ); - m_area.push_back( cellID.area() ); - m_row.push_back( cellID.row() ); - m_column.push_back( cellID.col() ); - - auto p = calo->cellCenter( cellID ); - m_xs.push_back( p.X() ); - m_ys.push_back( p.Y() ); - m_zs.push_back( p.Z() ); - m_es.push_back( digit->e() ); - double sinTheta = sqrt( p.X() * p.X() + p.Y() * p.Y() ) / sqrt( p.X() * p.X() + p.Y() * p.Y() + p.Z() * p.Z() ); - m_ets.push_back( digit->e() * sinTheta ); - if ( msgLevel( MSG::DEBUG ) ) debug() << cellID << " has an energy of " << m_es.back() << " \n"; - } - if ( msgLevel( MSG::DEBUG ) ) - debug() << " saved " << m_index.size() << " digits to n tuple " + m_CaloName + "Digit." << endmsg; - if ( m_verbose ) { - tuple - ->farray( m_extraName + m_CaloName + "DigitIndex", std::begin( m_index ), std::end( m_index ), - m_extraName + m_CaloName + "DigitNi", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "DigitCalo", std::begin( m_calo ), std::end( m_calo ), - m_extraName + m_CaloName + "DigitNc", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "DigitArea", std::begin( m_area ), std::end( m_area ), - m_extraName + m_CaloName + "DigitNa", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "DigitRow", std::begin( m_row ), std::end( m_row ), - m_extraName + m_CaloName + "DigitNr", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "DigitColumn", std::begin( m_column ), std::end( m_column ), - m_extraName + m_CaloName + "DigitNco", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "Digit_X", std::begin( m_xs ), std::end( m_xs ), - m_extraName + m_CaloName + "DigitNx", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "Digit_Y", std::begin( m_ys ), std::end( m_ys ), - m_extraName + m_CaloName + "DigitNy", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "Digit_Z", std::begin( m_zs ), std::end( m_zs ), - m_extraName + m_CaloName + "DigitNz", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "DigitEnergy", std::begin( m_es ), std::end( m_es ), - m_extraName + m_CaloName + "DigitNe", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->farray( m_extraName + m_CaloName + "DigitTransverseEnergy", std::begin( m_ets ), std::end( m_ets ), - m_extraName + m_CaloName + "DigitNe", m_maxSize ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - } - tuple - ->column( m_extraName + m_CaloName + "DigitEnergySum", - std::accumulate( std::begin( m_es ), std::end( m_es ), 0.0 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - tuple - ->column( m_extraName + m_CaloName + "DigitTransverseEnergySum", - std::accumulate( std::begin( m_ets ), std::end( m_ets ), 0.0 ) ) - .ignore( /* AUTOMATICALLY ADDED FOR gaudi/Gaudi!763 */ ); - m_index.clear(); - m_calo.clear(); - m_area.clear(); - m_row.clear(); - m_column.clear(); - m_xs.clear(); - m_ys.clear(); - m_zs.clear(); - m_es.clear(); - - return StatusCode::SUCCESS; -} diff --git a/Phys/DecayTreeTuple/src/TupleToolCaloDigits.h b/Phys/DecayTreeTuple/src/TupleToolCaloDigits.h deleted file mode 100755 index 707d66d5..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolCaloDigits.h +++ /dev/null @@ -1,64 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ -#ifndef TUPLETOOLCALODIGITS_H -#define TUPLETOOLCALODIGITS_H 1 - -// Include files -// from Gaudi -#include "CaloDet/DeCalorimeter.h" -#include "DecayTreeTupleBase/TupleToolBase.h" -#include "Kernel/IEventTupleTool.h" // Interface -#include "TupleToolCaloDigits.h" -class ITupleTool; - -/** @class TupleToolCaloDigits TupleToolCaloDigits.h - * - * \brief Add Calorimter digits to DecayTreeTuple - * - * Tuple columns: - * - Digit energy - * - Cell ID - * - Cell area, column and row - * \sa DecayTreeTuple - * @author Albert Bursche - * @date 2015-08-05 - */ -class TupleToolCaloDigits : public TupleToolBase, virtual public IEventTupleTool { -public: - /// Standard constructor - TupleToolCaloDigits( const std::string& type, const std::string& name, const IInterface* parent ); - - ~TupleToolCaloDigits() override = default; ///< Destructor - - StatusCode fill( Tuples::Tuple& ) override; - StatusCode initialize() override; - StatusCode finalize() override; - -private: - std::string m_DigitLocation = LHCb::CaloDigitLocation::Spd; - std::string m_CaloName = "Spd"; - std::string m_CaloLocation = DeCalorimeterLocation::Spd; - - std::vector m_index; - std::vector m_calo; - std::vector m_area; - std::vector m_row; - std::vector m_column; - std::vector m_xs; - std::vector m_ys; - std::vector m_zs; - std::vector m_es; - std::vector m_ets; - - unsigned long m_maxSize = 4096; - bool m_auto_configure = false; -}; -#endif // diff --git a/Phys/DecayTreeTuple/src/TupleToolCorrectedMass.cpp b/Phys/DecayTreeTuple/src/TupleToolCorrectedMass.cpp deleted file mode 100644 index 5b073fd6..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolCorrectedMass.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" - -#include "Event/Particle.h" - -#include "Kernel/GetIDVAlgorithm.h" -#include "Kernel/IDVAlgorithm.h" -#include "Kernel/IParticleTupleTool.h" // Interface - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -#include "TVector3.h" - -/** - * \brief Fill corrected mass (m_corr = sqrt( m_vis² + pT² ) + pT) and error on corrected mass - * - * - head_MCORR: corrected mass - * - head_MCORRERR : error on corrected mass - * - head_MCORRVERTEXERR: error on corrected mass, only taking the uncertainties on the vertices into account - * - * \sa DecayTreeTuple - * - * @author Michel De Cian (based on Will Sutcliffe's version) - * @date 2018-03-21 - */ -class TupleToolCorrectedMass : public TupleToolBase, virtual public IParticleTupleTool { - -public: - TupleToolCorrectedMass( const std::string& type, const std::string& name, const IInterface* parent ); - virtual StatusCode initialize() override; - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - double mCorr( const Gaudi::LorentzVector p, const TVector3 flightDir ) const; - double dPTdx( const double dAdx, const double dBdx, const double PT, const double A, const double B ) const; - std::pair mCorrErrors( const TVector3 sv, const TVector3 pv, const Gaudi::LorentzVector p, - const Gaudi::SymMatrix7x7 covP, const Gaudi::SymMatrix3x3 covPV ) const; - - IDVAlgorithm* m_dva; -}; - -using namespace LHCb; -using namespace Gaudi::Units; -using namespace ROOT::Math; - -DECLARE_COMPONENT( TupleToolCorrectedMass ) -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolCorrectedMass::TupleToolCorrectedMass( const std::string& type, const std::string& name, - const IInterface* parent ) - : TupleToolBase( type, name, parent ), m_dva( nullptr ) { - declareInterface( this ); -} -//============================================================================= -// -- Initialize -//============================================================================= -StatusCode TupleToolCorrectedMass::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - m_dva = Gaudi::Utils::getIDVAlgorithm( contextSvc(), this ); - if ( !m_dva ) return Error( "Couldn't get parent DVAlgorithm", StatusCode::FAILURE ); - - return sc; -} -//============================================================================= -// -- The main method -//============================================================================= -StatusCode TupleToolCorrectedMass::fill( const Particle* mother, const Particle* P, const std::string& head, - Tuples::Tuple& tuple, IGeometryInfo const& geometry ) { - - const std::string prefix = fullName( head ); - Assert( P && mother, "This should not happen, you are inside TupleToolCorrectedMass.cpp :(" ); - if ( !P ) return StatusCode::FAILURE; - if ( !( P->particleID().hasBottom() ) ) return StatusCode::SUCCESS; - - const LHCb::Vertex* BEndVertex = P->endVertex(); - const LHCb::VertexBase* primaryVertex = m_dva->bestVertex( P, geometry ); - - const Gaudi::LorentzVector pMother = P->momentum(); - - const TVector3 PV( primaryVertex->position().X(), primaryVertex->position().Y(), primaryVertex->position().Z() ); - const TVector3 SV( BEndVertex->position().X(), BEndVertex->position().Y(), BEndVertex->position().Z() ); - const TVector3 flightDir = ( SV - PV ).Unit(); - - const double MCorr = mCorr( pMother, flightDir ); - const std::pair MCorrErrors = - mCorrErrors( SV, PV, pMother, P->covMatrix(), primaryVertex->covMatrix() ); - - bool test = true; - test &= tuple->column( prefix + "_MCORR", MCorr ); - test &= tuple->column( prefix + "_MCORRERR", MCorrErrors.second ); - test &= tuple->column( prefix + "_MCORRVERTEXERR", MCorrErrors.first ); // only errors on vertices - - // -- the pT relative to the flight direction - const TVector3 pVec( pMother.Px(), pMother.Py(), pMother.Pz() ); - const double PT = pVec.Perp( flightDir ); - test &= tuple->column( prefix + "_PTREL", PT ); - - return StatusCode( test ); -} -//========================================================================= -// -- Calculate the corrected mass: m_corr = sqrt( m_vis² + pT² ) + pT -//========================================================================= -double TupleToolCorrectedMass::mCorr( const Gaudi::LorentzVector p, const TVector3 flightDir ) const { - const TVector3 pVec( p.Px(), p.Py(), p.Pz() ); - const double PT = pVec.Perp( flightDir ); - return std::sqrt( p.M2() + PT * PT ) + PT; -} -//========================================================================= -// -- Helper calculation for mCorrErrors -//========================================================================= -double TupleToolCorrectedMass::dPTdx( const double dAdx, const double dBdx, const double PT, const double A, - const double B ) const { - - return 1 / PT * -0.5 * ( 2 * A * B * dAdx - A * A * dBdx ) / ( B * B ); -} -//========================================================================= -// -- Calculate the corrected mass error -//========================================================================= -std::pair TupleToolCorrectedMass::mCorrErrors( const TVector3 sv, const TVector3 pv, - const Gaudi::LorentzVector p, - const Gaudi::SymMatrix7x7 covP, - const Gaudi::SymMatrix3x3 covPV ) const { - // -- - // -- m_corr = sqrt( m_vis² + pT² ) + pT - // -- - // -- To transform the errors on the vertices and the momentum to the corrected mass, one essentially needs to do - // -- mcorr_err² = Sum_i,j( d(m_corr)/dx_i d(m_corr)/dx_j M_ij )_PV + Sum_n,m( d(m_corr)/dx_n d(m_corr)/dx_m M_nm )_SV - // -- where M_ij is the covariance matrix of the PV, and M_nm the covariance matrix of the SV, including uncertainties - // of the momenta - // -- of the particles that formed the SV. - // -- - // -- For the vertex coordinates: - // -- d(m_corr) / dx = d(m_corr)/dpT * dpT/dx - // -- d(m_corr)/dpT = 1/2 * 1/std::sqrt( m_vis² + pT² ) * 2 * pT + 1; - // -- pT = sqrt( (p_vec - (x_SV_vec - x_PV_vec) * A/B)² ) - // -- with A = px(x_SV - x_PV) + py(y_SV - y_PV) + pz(z_SV - z_PV) - // -- and B = (x_SV - x_PV)² + (y_SV - y_PV)² + (z_SV - z_PV)², or the magnitude squared of x_SV_vec - x_PV_vec - // -- - // -- For the momentum coordinates: - // -- m_vis² = E² - (px² + py² + pz²) - // -- d(m_corr) / dpx = 1/2 * 1 / sqrt( m_vis² + pT²) * ( -2A/B(x_SV-x_PV) ) + 1/pT * ( px - 2A/B(x_SV - x_PV) ) - // -- d(m_corr) / dE = 1/2 * / sqrt( m_vis² + pT²) * 2E - - const double x_SV = sv.Px(); // SV - const double y_SV = sv.Py(); // SV - const double z_SV = sv.Pz(); // SV - const double x_PV = pv.Px(); // PV - const double y_PV = pv.Py(); // PV - const double z_PV = pv.Pz(); // PV - const double px = p.Px(); - const double py = p.Py(); - const double pz = p.Pz(); - const double E = p.E(); - - const TVector3 pVec( p.Px(), p.Py(), p.Pz() ); - const double PT = pVec.Perp( ( sv - pv ) ); - const double A = px * ( x_SV - x_PV ) + py * ( y_SV - y_PV ) + pz * ( z_SV - z_PV ); - const double B = ( sv - pv ).Mag2(); - - const double invSqrtMassPT = 1 / std::sqrt( p.M2() + PT * PT ); - const double dMcorrdPT = 0.5 * invSqrtMassPT * 2 * PT + 1; - - // -- First let's calculate the derivates of 'A' and 'B' - // -- A - const double dAdx_SV = px; - const double dAdy_SV = py; - const double dAdz_SV = pz; - - const double dAdx_PV = -px; - const double dAdy_PV = -py; - const double dAdz_PV = -pz; - - const double dAdpx = x_SV - x_PV; - const double dAdpy = y_SV - y_PV; - const double dAdpz = z_SV - z_PV; - - // -- B - const double dBdx_SV = 2 * ( x_SV - x_PV ); - const double dBdy_SV = 2 * ( y_SV - y_PV ); - const double dBdz_SV = 2 * ( z_SV - z_PV ); - - const double dBdx_PV = -2 * ( x_SV - x_PV ); - const double dBdy_PV = -2 * ( y_SV - y_PV ); - const double dBdz_PV = -2 * ( z_SV - z_PV ); - - // -- the vertices - const double dMcdx_SV = dMcorrdPT * dPTdx( dAdx_SV, dBdx_SV, PT, A, B ); - const double dMcdy_SV = dMcorrdPT * dPTdx( dAdy_SV, dBdy_SV, PT, A, B ); - const double dMcdz_SV = dMcorrdPT * dPTdx( dAdz_SV, dBdz_SV, PT, A, B ); - - const double dMcdx_PV = dMcorrdPT * dPTdx( dAdx_PV, dBdx_PV, PT, A, B ); - const double dMcdy_PV = dMcorrdPT * dPTdx( dAdy_PV, dBdy_PV, PT, A, B ); - const double dMcdz_PV = dMcorrdPT * dPTdx( dAdz_PV, dBdz_PV, PT, A, B ); - - // -- the momentum - const double dMcdpx = -1 * invSqrtMassPT * A / B * dAdpx + 1 / PT * ( px - A / B * dAdpx ); - const double dMcdpy = -1 * invSqrtMassPT * A / B * dAdpy + 1 / PT * ( py - A / B * dAdpy ); - const double dMcdpz = -1 * invSqrtMassPT * A / B * dAdpz + 1 / PT * ( pz - A / B * dAdpz ); - const double dMcdE = invSqrtMassPT * E; - - // -- the errors on the vertices - const double errsqVertex = - // -- the diagonal for SV - covP( 0, 0 ) * dMcdx_SV * dMcdx_SV + covP( 1, 1 ) * dMcdy_SV * dMcdy_SV + covP( 2, 2 ) * dMcdz_SV * dMcdz_SV + - // -- the diagonal for PV - covPV( 0, 0 ) * dMcdx_PV * dMcdx_PV + covPV( 1, 1 ) * dMcdy_PV * dMcdy_PV + covPV( 2, 2 ) * dMcdz_PV * dMcdz_PV + - // -- the cross terms for SV - covP( 0, 1 ) * 2. * dMcdx_SV * dMcdy_SV + covP( 0, 2 ) * 2. * dMcdx_SV * dMcdz_SV + - covP( 1, 2 ) * 2. * dMcdy_SV * dMcdz_SV + - // -- the cross terms for PV - covPV( 0, 1 ) * 2. * dMcdx_PV * dMcdy_PV + covPV( 0, 2 ) * 2. * dMcdx_PV * dMcdz_PV + - covPV( 1, 2 ) * 2. * dMcdy_PV * dMcdz_PV; - - // -- the errors on the momentum x vertex - const double errsqMom = - // -- the diagonal for the momentum - covP( 3, 3 ) * dMcdpx * dMcdpx + covP( 4, 4 ) * dMcdpy * dMcdpy + covP( 5, 5 ) * dMcdpz * dMcdpz + - covP( 6, 6 ) * dMcdE * dMcdE + - // -- momentum x momomentum cross terms - covP( 3, 4 ) * 2. * dMcdpx * dMcdpy + covP( 3, 5 ) * 2. * dMcdpx * dMcdpz + covP( 3, 6 ) * 2. * dMcdpx * dMcdE + - covP( 4, 5 ) * 2. * dMcdpy * dMcdpz + covP( 4, 6 ) * 2. * dMcdpy * dMcdE + covP( 5, 6 ) * 2. * dMcdpz * dMcdE + - // -- momentum x position terms - covP( 0, 3 ) * 2. * dMcdx_SV * dMcdpx + covP( 1, 3 ) * 2. * dMcdy_SV * dMcdpx + - covP( 2, 3 ) * 2. * dMcdz_SV * dMcdpx + covP( 0, 4 ) * 2. * dMcdx_SV * dMcdpy + - covP( 1, 4 ) * 2. * dMcdy_SV * dMcdpy + covP( 2, 4 ) * 2. * dMcdz_SV * dMcdpy + - covP( 0, 5 ) * 2. * dMcdx_SV * dMcdpz + covP( 1, 5 ) * 2. * dMcdy_SV * dMcdpz + - covP( 2, 5 ) * 2. * dMcdz_SV * dMcdpz + covP( 0, 6 ) * 2. * dMcdx_SV * dMcdE + - covP( 1, 6 ) * 2. * dMcdy_SV * dMcdE + covP( 2, 6 ) * 2. * dMcdz_SV * dMcdE; - - return std::make_pair( std::sqrt( errsqVertex ), std::sqrt( errsqVertex + errsqMom ) ); -} diff --git a/Phys/DecayTreeTuple/src/TupleToolDira.cpp b/Phys/DecayTreeTuple/src/TupleToolDira.cpp deleted file mode 100755 index 2d4b9ded..00000000 --- a/Phys/DecayTreeTuple/src/TupleToolDira.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/*****************************************************************************\ -* (c) Copyright 2000-2018 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. * -\*****************************************************************************/ - -#include "DecayTreeTupleBase/TupleToolBase.h" - -#include "Kernel/IParticleTupleTool.h" // Interface -#include -#include -#include - -#include "Event/Particle.h" -#include "Event/RecVertex.h" -#include "Event/Vertex.h" - -#include "GaudiAlg/Tuple.h" -#include "GaudiAlg/TupleObj.h" - -#include "Math/SMatrix.h" - -/* - * 2010-09-06 : Fatima Soomro - */ -class TupleToolDira : public TupleToolBase, virtual public IParticleTupleTool { - -private: - typedef ROOT::Math::SMatrix> SymMatrix10x10; - -public: - /// Standard constructor - TupleToolDira( const std::string& type, const std::string& name, const IInterface* parent ); - - virtual ~TupleToolDira(){}; ///< Destructor - - StatusCode initialize() override; - - StatusCode fill( const LHCb::Particle*, const LHCb::Particle*, const std::string&, Tuples::Tuple&, - IGeometryInfo const& ) override; - -private: - StatusCode fillDIRAError( const LHCb::VertexBase* primVtx, const LHCb::Particle* P, const std::string head, - Tuples::Tuple& tuple ) const; - void calculateDIRAError( const LHCb::Particle*, const LHCb::VertexBase*, double&, double& ) const; - - // IContextTool* m_context; - IDVAlgorithm* m_context; -}; - -using namespace LHCb; - -//============================================================================= -// Standard constructor, initializes variables -//============================================================================= -TupleToolDira::TupleToolDira( const std::string& type, const std::string& name, const IInterface* parent ) - : TupleToolBase( type, name, parent ) - -{ - declareInterface( this ); -} - -StatusCode TupleToolDira::initialize() { - const StatusCode sc = TupleToolBase::initialize(); - if ( sc.isFailure() ) return sc; - - m_context = Gaudi::Utils::getIDVAlgorithm( contextSvc(), this ); - if ( !m_context ) return Error( "Could not get parent DVAlgorithm", StatusCode::FAILURE ); - - retur